一、概述
websocket是基于tcp的一种新的网络协议。它实现了浏览器与服务器 全双工通信 —浏览器和服务器只需要完成一次握手,两者之间就可以创建 持久性 的连接,并进行双向数据传输。
- http传输
- websocket传输
http协议和websocket协议的对比:
- http是短连接,websocket是长连接
- http通信是单向的,基于请求响应模式,websocket支持双向通信。
- http和websocket底层都是tcp连接
websocket应用场景:
- 视频弹幕
- 网页聊天
- 体育实况更新
- 股票基金报价实时更新
二、入门
2.1 pom依赖
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-websocket</artifactid> </dependency>
2.2 编写配置类
import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.web.socket.server.standard.serverendpointexporter; /** * websocket配置类,用于注册websocket的bean */ @configuration public class websocketconfiguration { @bean public serverendpointexporter serverendpointexporter() { return new serverendpointexporter(); } }
2.3 编写websocket服务
import org.springframework.stereotype.component; import javax.websocket.onclose; import javax.websocket.onmessage; import javax.websocket.onopen; import javax.websocket.session; import javax.websocket.server.pathparam; import javax.websocket.server.serverendpoint; import java.util.collection; import java.util.hashmap; import java.util.map; /** * websocket服务 */ @component @serverendpoint("/ws/{sid}") public class websocketserver { //存放会话对象 private static map<string, session> sessionmap = new hashmap(); /** * 连接建立成功调用的方法 */ @onopen public void onopen(session session, @pathparam("sid") string sid) { system.out.println("客户端:" + sid + "建立连接"); sessionmap.put(sid, session); } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 */ @onmessage public void onmessage(string message, @pathparam("sid") string sid) { system.out.println("收到来自客户端:" + sid + "的信息:" + message); } /** * 连接关闭调用的方法 * * @param sid */ @onclose public void onclose(@pathparam("sid") string sid) { system.out.println("连接断开:" + sid); sessionmap.remove(sid); } /** * 群发 * * @param message */ public void sendtoallclient(string message) { collection<session> sessions = sessionmap.values(); for (session session : sessions) { try { //服务器向客户端发送消息 session.getbasicremote().sendtext(message); } catch (exception e) { e.printstacktrace(); } } } }
2.4 浏览器页面
<!doctype html> <html> <head> <meta charset="utf-8"> <title>websocket demo</title> </head> <body> <input id="text" type="text" /> <button onclick="send()">发送消息</button> <button onclick="closewebsocket()">关闭连接</button> <div id="message"> </div> </body> <script type="text/javascript"> var websocket = null; var clientid = math.random().tostring(36).substr(2); //判断当前浏览器是否支持websocket if('websocket' in window){ //连接websocket节点 websocket = new websocket("ws://localhost:8080/ws/"+clientid); } else{ alert('not support websocket') } //连接发生错误的回调方法 websocket.onerror = function(){ setmessageinnerhtml("error"); }; //连接成功建立的回调方法 websocket.onopen = function(){ setmessageinnerhtml("连接成功"); } //接收到消息的回调方法 websocket.onmessage = function(event){ setmessageinnerhtml(event.data); } //连接关闭的回调方法 websocket.onclose = function(){ setmessageinnerhtml("close"); } //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function(){ websocket.close(); } //将消息显示在网页上 function setmessageinnerhtml(innerhtml){ document.getelementbyid('message').innerhtml += innerhtml + '<br/>'; } //发送消息 function send(){ var message = document.getelementbyid('text').value; websocket.send(message); } //关闭连接 function closewebsocket() { websocket.close(); } </script> </html>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论