Websocket的使用范例
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>
相关推荐
柳木木的IT 2020-11-04
joynet00 2020-09-23
wenf00 2020-09-14
蓝色深海 2020-08-16
wuychn 2020-08-16
取个好名字真难 2020-08-06
darylove 2020-06-26
shufen0 2020-06-20
Lovexinyang 2020-06-14
WangBowen 2020-06-14
firejq 2020-06-14
hjhmpl 2020-06-14
水痕 2020-06-07
guozewei0 2020-06-06
woniyu 2020-06-02
取个好名字真难 2020-06-01
guozewei0 2020-05-28
woniyu 2020-05-26