一.jar包依赖
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
二.后台代码
package com.miracle.websocket;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ServerEndpoint("/websocket/{name}")
public class WebSocket {
private String name;
private Session session;
private static Map<String, WebSocket> allClients = new ConcurrentHashMap<>();
@OnOpen
public void onOpen(@PathParam("name") String name, Session session){
this.name = name;
this.session = session;
allClients.put(name, this);
}
@OnMessage
public void onMessage(Session session, String message) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, String> jsonMap = objectMapper.readValue(message, Map.class);
String toUser = jsonMap.get("toUser");
String toMessage = jsonMap.get("toMessage");
WebSocket webSocket = allClients.get(toUser);
if (webSocket != null){
Session toSession = webSocket.getSession();
if (toSession.isOpen()){
toSession.getAsyncRemote().sendText(toMessage);
}
}else {
session.getAsyncRemote().sendText("对方不在线");
}
}
@OnError
public void onError(Session session, Throwable e){
}
@OnClose
public void onClose(Session session){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Session getSession() {
return session;
}
public void setSession(Session session) {
this.session = session;
}
public static Map<String, WebSocket> getAllClients() {
return allClients;
}
public static void setAllClients(Map<String, WebSocket> allClients) {
WebSocket.allClients = allClients;
}
}
三.前台代码
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript">
var webSocket = null;
function connection() {
var username = document.getElementById("name").value;
// 判断浏览器是否支持websocket
if ('WebSocket' in window){
webSocket = new WebSocket("ws://" + document.location.host + "/websocket/" + username);
}else {
alert('不支持Websocket')
}
webSocket.onopen = function () {
document.getElementById("message").innerHTML = "建立连接了";
};
webSocket.onmessage = function (event) {
var data = event.data;
document.getElementById("message").innerHTML = "收到消息了:" + data;
};
webSocket.onerror = function () {
document.getElementById("message").innerHTML = "出现异常了";
};
webSocket.onclose = function () {
document.getElementById("message").innerHTML = "连接关闭了";
};
// 当浏览器的页面窗口关闭的时候,此处应该关闭连接,释放服务器资源
window.onbeforeunload = function (event) {
if (webSocket != null){
webSocket.close();
}
}
};
function sendMessage(){
var toUser = document.getElementById("toUser").value;
var toMessage = document.getElementById("toMessage").value;
if(webSocket != null){
var message = '{"toUser":"' + toUser + '","toMessage":"' + toMessage + '"}'
webSocket.send(message);
}
}
</script>
</head>
<body>
<input type="text" id="name" name="name">
<button onclick="connection()">连接</button>
<br>
接收者名字:<input type="text" name="toUser" id="toUser"><br>
内容:<input type="text" name="toMessage" id="toMessage"><br>
<button onclick="sendMessage()">发送</button>
<h2 id="message">Hello World!</h2>
</body>
</html>