`
raymond.chen
  • 浏览: 1443762 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Websocket的使用范例

    博客分类:
  • Java
 
阅读更多

        WebSocket是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex),能更好的节省服务器资源和带宽并达到实时通讯,它建立在TCP之上,同HTTP一样通过TCP来传输数据,但是它和HTTP最大不同是:

        WebSocket是一种双向通信协议,在建立连接后,WebSocket服务器和Browser/Client Agent都能主动的向对方发送或接收数据,就像Socket一样;

        WebSocket需要类似TCP的客户端和服务器端通过握手连接,连接成功后才能相互通信。

 

       在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” (handshaking)。

 

 本范例在apache-tomcat-7.0.69环境下测试通过,工程主要用到以下jar包:websocket-api.jar(Tomcat自带)、tomcat-juli-7.0.27.jar等。

 

Java类源码:

@ServerEndpoint("/websocket")
public class MyWebsocket {
	private Timer timer;
	private static AtomicLong socketCount = new AtomicLong();
	private Session session;
	
	//客户端和服务端建立链接的Websocket集合
	private static CopyOnWriteArraySet<MyWebsocket> webSocketSet = new CopyOnWriteArraySet<MyWebsocket>();
	
	/**
	 * 建立链接
	 */
	@OnOpen
	public void onOpen(Session session){
		this.session = session;
		webSocketSet.add(this);
		
		//启动一个单独的线程,每隔一秒钟推送当前时间到web客户端
		timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				//batch(sdf.format(new Date()));
			}
		}, 0, 1000L);
		
		System.out.println("session count is " + socketCount.incrementAndGet());
	}
	
	/**
	 * 关闭链接
	 */
	@OnClose
	public void opClose(){
		webSocketSet.remove(this);
		
		if(timer != null){
			timer.cancel();
			timer = null;
		}

		System.out.println("session count is " + socketCount.decrementAndGet());
	}
	
	/**
	 * 服务端接收客户端发来的消息
	 * @param message
	 * @param session
	 */
	@OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("来自客户端的消息:" + message);
        batch(message);
    }
	
	/**
	 * 往所有web客户端发送消息
	 * @param message
	 */
	private void batch(String message){
		for(MyWebsocket item: webSocketSet){
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }
        }
	}
	
	/**
	 * 发送消息到web客户端
	 * @param message
	 * @throws IOException
	 */
	public void sendMessage(String message) throws IOException{
        this.session.getBasicRemote().sendText(message);
        //this.session.getAsyncRemote().sendText(message);
    }
	
	/**
	 * 异常处理
	 * @param session
	 * @param error
	 */
	@OnError
	public void onError(Session session, Throwable error){
        System.out.println("发生错误");
        error.printStackTrace();
    }
}

 

JSP页面代码:

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Web Socket</title>
  </head>
  <body>
  	<input id="text" type="text" />
  	<button onclick="send()">Send</button>    
  	<button onclick="closeWebSocket()">Close</button>
    <div id="message">
    </div>
    
    <script type="text/javascript">
      var websocket = null;
       
      if('WebSocket' in window){
          websocket = new WebSocket("ws://localhost:8080/ws/websocket");
      }else{
          alert('Not support websocket');
      }
       
      //连接出现错误,触发该方法
      websocket.onerror = function(){
          setMessageInnerHTML("error");
      };
       
      //成功建立连接,触发该方法
      websocket.onopen = function(event){
          setMessageInnerHTML("连接已建立,可以开始群聊啦!");
      }
       
      //客户端收到消息,触发该方法
      websocket.onmessage = function(event){
          setMessageInnerHTML(event.data);
      }
       
      //连接关闭,触发该方法
      websocket.onclose = function(){
          setMessageInnerHTML("连接已关闭!");
      }
       
      //窗口关闭时,关闭websocket连接
      window.onbeforeunload = function(){
          websocket.close();
          websocket = null;
      }
       
      //将消息显示在网页上
      var i = 0;
      function setMessageInnerHTML(innerHTML){
          document.getElementById('message').innerHTML = innerHTML + '<br/>' + document.getElementById('message').innerHTML;
          ++i;
          
          if(i > 20){
          	  i = 0;
          	  document.getElementById('message').innerHTML = innerHTML = "";
          }
      }
       
      //关闭连接
      function closeWebSocket(){
          websocket.close();
          websocket = null;
      }
       
      //发送消息到服务端
      function send(){
          var message = document.getElementById('text').value;
          websocket.send(message);
          document.getElementById('text').value = "";
          document.getElementById('text').focus();
      }
  </script>
  </body>
</html>

 

分享到:
评论

相关推荐

    websocket-sharp 范例

    这个"WebSocketSharp 范例"是为了解决旧版.NET Framework下无法轻易使用WebSocket的问题。 首先,WebSocketSharp库提供了易于使用的API,包括创建WebSocket服务器和客户端的类。`WebSocketServer`类用于构建服务器...

    WebSocket通讯范例

    学习和理解这个WebSocket通讯范例,可以帮助开发者掌握WebSocket的基本用法,从而在实时聊天应用、在线游戏、股票交易系统等需要实时数据交互的场景中应用WebSocket技术。通过分析和调试示例代码,你可以深入理解...

    Spring-Websocket 演示范例

    本资源演示了基于Spring5.3.8 版本下做的WebSocket通讯,演示了三种方式建立简单的页面方式调用WebSocket,分别是@bean模式、@Autowired模式以及xml模式,主要使用了 org.springframework.web.socket.handler....

    一个基于websocket-sharp的在线聊天范例

    本项目是一个基于websocket-sharp开源dll封装的在线聊天项目,服务端采用WinForm作为服务引擎。用于framwork4.5版本实现websocket。

    unity3d websocket 客户端库 socket.io v3 v4

    unity3d商城付费资源,用于实现websocket客户端,有服务端范例代码

    simple-websocket-client:一个简单的websocket客户端,使用“ ws”进行websocket通信,promise和类似于socket.io的JSON发射

    使用范例 var WebSocket = require('simple-websocket-client').WebSocket; var socket = new WebSocket('ws://my-domain.com:8080'); socket.on('open').then(function () { console.log('connected'); socket....

    Spring.websocket.stomp演示范例

    完整的可运行的项目,基于Sprin框架搭建,采用Spring5.3.8版本,内嵌相关的所有应用jar包,可直接在IDEA环境下运行。 演示项目包含了两部分...工程适用于使用JAVA 做双工开发的项目,同样适用于订阅发布机制的JAVA项目

    24【源码】数据可视化:基于 Echarts + Python 动态实时大屏范例 - WebSocket协议.zip

    在本项目中,我们将探讨如何使用Echarts,一个强大的JavaScript图表库,结合Python编程语言,通过WebSocket协议实现动态实时的数据大屏展示。 Echarts是由百度开发的开源图表库,支持丰富的图表类型,如折线图、...

    PHP-websocket-client

    使用PHP连接到websocket服务。 这3个功能使websocket进行协商和连接,并处理所需的hybi10帧编码。 范例1: if( $sp = websocket_open('echo.websocket.org',80) ) { websocket_write($sp,"hello server"); echo...

    微信小程序:你猜我画小游戏范例.rar

    微信小程序:你猜我画小游戏编写范例源码,本小程序源码主要演示会话服务和 WebSocket 信道服务的使用方式,感觉是一个小游戏,没有玩过这种游戏,有兴趣的下载源码,可学习了解一些微信小程序环境下的游戏开发技巧...

    基于TIO的语音报单小程序案例

    考虑到系统的运行负载,每日高达约4.5万次的稳定消费以及每个商户平均使用2个客户端进行连接,系统需要处理近10万次的消息推送,而且还要维持大量的WebSocket连接。这样的高并发处理能力要求技术架构必须高效稳定。...

    Android SDK开发范例大全源码

    同时,还可能包含有关使用WebSocket进行实时通信的示例。 4. **多媒体处理**:这部分会讲解如何播放音频和视频,使用MediaRecorder进行录音,以及使用Camera API拍摄照片。此外,也可能包含图像处理,如使用Glide或...

    Google Android SDK开发范例大全(完整版)

    书中的范例可能包括使用HttpURLConnection、OkHttp、Volley等库进行网络请求的实现。 8. **多媒体处理**:Android支持音频、视频和图像的处理。书可能涵盖如何播放媒体文件、捕获照片、裁剪图片以及使用OpenGL进行...

    C#开发范例开发大全(刘丽霞编源代码)

    《C#开发范例开发大全》是刘丽霞编著的一本面向C#开发者的重要参考资料,这本书的核心价值在于其丰富的程序范例,旨在帮助读者深入理解和掌握C#编程语言的各种特性和应用场景。通过实践这些范例,开发者可以提升自己...

    Android开发范例大全

    HTTP请求、WebSocket、Retrofit、OkHttp等库的使用是常见的范例,同时也会涉及到JSON或XML数据解析。 5. **服务(Service)**:服务是在后台长时间运行的组件,用于执行不需要用户交互的任务。范例可能包含启动服务...

    前端开源库-home-assistant-js-websocket.zip

    "home-assistant-js-websocket" 是一个专门为前端开发者设计的开源库,用于与Home Assistant智能家居系统进行交互。这个库利用WebSocket协议,实现...同时,这个库也为其他基于WebSocket的项目提供了参考和学习的范例。

    c#经典编程范例50讲

    17. **网络编程**:学习TCP/IP通信,使用Socket进行网络数据传输,以及WebSocket等现代网络技术。 18. **反射与元数据**:理解C#中的反射机制,以及如何使用Assembly、Type、MethodInfo等类来操作运行时的类型信息...

    websockets-scaling:通过Docker Swarm和Kubernetes扩展Websocket的教程

    它被配置为使用本机websocket,而不会尝试将naïfes解决方案用作http轮询。 { transports: ['websocket'] } 它会在连接时将消息发送到单个服务器实例。 注意,此消息应仅由单个服务器实例接收。

    Android项目开发范例大全

    4. **网络编程**:Android应用常常需要与服务器进行数据交换,这涉及到HTTP请求、WebSocket通信等。你将在这里看到使用HttpURLConnection、OkHttp或Retrofit进行网络请求的示例,以及如何处理JSON或XML数据。 5. **...

    simple-chatroom-realtime:使用Java websocket实时进行聊天室

    使用Java Websocket实时聊天室 服务器和客户端将通过websocket相互通信,消息以JSON文件的形式发送。 与http请求答案的机制不同,由于websocket是TCP协议,因此它将遵循3步握手模型。 websocket的标准协议对于常规...

Global site tag (gtag.js) - Google Analytics