一、概述
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>总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论