WebSocket
WebSocket是一种协议
客户端
| 事件 | 事件处理程序 | 描述 |
|---|
| open | websocket对象.onopen | 连接建立时触发 |
| message | websocket对象.onmessage | 客户端收到服务端数据时触发 |
| error | websocket对象.onerror | 通信发生错误时触发 |
| cloes | websocket对象.close | 连接关闭时触发 |
客户端处理
var user = sessionStorage.getItem("userName");
var hyUser;
var ws = new WebSocket("ws://localhost:7070/chat/"+sessionStorage.getItem("userName"));
ws.onopen = function (){
$(".userName1").html(user+"<h7 style='color: green'>在线</h7>");
}
ws.onmessage = function (res){
var data = JSON.parse(res.data);
if (data.isSystem){
isSystem(data);
}else {
noIsSystem(data);
}
}
ws.onclose = function (){
$(".userName1").html(user+"<h7 style='color: red'>离线</h7>");
}
function isSystem(data){
var hyxx = "";
var xtxx = "";
for (var name of data.message){
if(name == user) continue;
hyxx+="<li class='hy'>"+name+"</li>";
xtxx+="<li class='xt' style='color: #9d9d9d'>"+name+"---->已上线</li>";
}
$("#hyxx").html(hyxx);
$("#xtxx").html(xtxx);
var hyList = document.querySelectorAll(".hy");
hyList.forEach((item, index) => {
item.addEventListener('click', () => {
hyUser = hyList[index].innerText;
$(".userName2").text("当前正与" + hyUser + "聊天");
});
});
}
function noIsSystem(data){
console.log(data);
}
$("#submit").click(function (){
var data =$("#input_text").val();
$("#input_text").val("")
var json ={"userName":hyUser,"message":user+"----->"+hyUser+"----->"+data};
ws.send(JSON.stringify(json));
})
$("#exit").click(function (){
window.location.replace("login.html");
})
服务端
| 方法 | 描述 | 注解 |
|---|
| onClose() | 当会话关闭时调用 | @onClose |
| onOpen() | 当开启一个新的会话时调用,该方法是客户端与服务端握手成功后调用 | @onOpen |
| onError() | 当连接过程中异常时调用 | @onError |
服务端消息通信层
package com.dayu.websocket.ws;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dayu.websocket.utils.MessageUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@ServerEndpoint("/chat/{userName}")
@Component
@Slf4j
public class ChatEndpoint {
private static Map<String,ChatEndpoint> userNameMap = new ConcurrentHashMap<>();
private Session session;
@OnOpen
public void onOpen(Session session,@PathParam("userName") String userName){
this.session=session;
System.out.println("userName=============>"+userName);
userNameMap.put(userName,this);
String message = MessageUtils.getMessage(true,null,getUserName());
UserAll(message);
log.info("当前在线人数=========>"+userNameMap.size()+"人");
}
private void UserAll(String message){
try {
Set<String> names = userNameMap.keySet();
for (String name : names){
ChatEndpoint chatEndpoint = userNameMap.get(name);
chatEndpoint.session.getBasicRemote().sendText(message);
}
} catch (IOException e) {
System.out.println("6=>6=>6");
}
}
private Set<String> getUserName(){
return userNameMap.keySet();
}
@OnMessage
public void onMessage(String message,Session session){
JSONObject json = JSON.parseObject(message);
String user = json.getString("message");
String[] userMessage = user.split("----->");
try {
String resultMessage = MessageUtils.getMessage(false,userMessage[0],userMessage[2]);
System.out.println(userMessage[0]+"------------------>"+userMessage[1]);
System.out.println("<<"+userMessage[2]+">>");
userNameMap.get(userMessage[1]).session.getBasicRemote().sendText(resultMessage);
} catch (IOException e) {
System.out.println("6=>6=>6");
}
}
@OnClose
public void onClose(@PathParam("userName") String userName){
System.out.println(userName);
userNameMap.remove(userName);
log.error("当前在线人数=========>"+userNameMap.size()+"人");
}
}
服务端配置类
package com.dayu.websocket.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebsocketConfiguration {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}