引入naven配置
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
后台编写websocket服务类
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketMessage;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Set;
@ServerEndpoint("/service")
@Component
public class websoketTest {
public websoketTest(){}
@OnOpen
public void onopen(Session session){
System.out.println("连接成功");
try {
session.getBasicRemote().sendText("hello client...");
} catch (IOException e) {
e.printStackTrace();
}
}
@OnClose
public void onclose(Session session){
System.out.println("close....");
}
@OnMessage
public void onsend(Session session,String msg){
try {
// 广播消息
Set<Session> sess = session.getOpenSessions();
for(Session s : sess){
s.getBasicRemote().sendText("client"+s.getId()+"___say:"+msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用内嵌容器需要被 Spring 管理并初始化
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
前端接收html
<body>
<ul id="content"></ul>
<form class="form">
<input type="text" placeholder="请输入发送的消息" class="message" id="message"/>
<input type="button" value="发送" id="send" class="connect"/>
<input type="button" value="连接" id="connect" class="connect"/>
</form>
<script>
var oUl=document.getElementById('content');
var oConnect=document.getElementById('connect');
var oSend=document.getElementById('send');
var oInput=document.getElementById('message');
var ws=null;
oConnect.onclick=function(){
ws =new WebSocket('ws://localhost:8080/service');
ws.onopen=function(){
oUl.innerHTML+="<li>客户端已连接</li>";
}
ws.onmessage=function(evt){
oUl.innerHTML+="<li>"+evt.data+"</li>";
}
ws.onclose=function(){
oUl.innerHTML+="<li>客户端已断开连接</li>";
};
ws.onerror=function(evt){
oUl.innerHTML+="<li>"+evt.data+"</li>";
};
};
oSend.onclick=function(){
if(ws){
ws.send(oInput.value);
}
}
</script>
</body>
配合数据库或其它缓存服务可以实现复杂的推送服务
其它实现方式大同小异
如果觉得封装的太多,可以研究注解@ServerEndpoint
关键点是ServerEndpointConfig.Configurator,重写modifyHandshake完成握手,会灵活一些