jdk 1.8
1、导入maven依赖
<!-- websocket服务端依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- websocket客户端依赖 -->
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.5</version>
</dependency>
2、config配置类
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
3、消息体类
@Data
public class WebsocketMessage {
private String id; // 接收消息的用户id
private String toType; // 消息类型
private String fromUserId; // 消息发送的用户id
private String message; // 消息体
}
4、websocket服务端
@Slf4j
@Component
@ServerEndpoint("/websocket/{id}")
public class WebSocketServer {
private Session session;
private String id;
private static ConcurrentHashMap<String, WebSocketServer> sessionPools = new ConcurrentHashMap<>();
@OnOpen
public void OnOpen(Session session, @PathParam("id") String id) {
this.session = session;
this.id = id;
sessionPools.put(id, this);
log.info("[WebSocketServer] 连接成功,当前连接人数:{}人", sessionPools.size());
}
@OnClose
public void OnClose() {
sessionPools.remove(this.id);
log.info("[WebSocketServer] 退出成功,当前连接人数:{}人", sessionPools.size());
}
@OnMessage
public void OnMessage(String message) {
log.info("[WebSocketServer] 收到消息:{}",message);
Gson gson = new Gson();
WebsocketMessage webSocketMessage = gson.fromJson(message, WebsocketMessage.class);
if (webSocketMessage.getToType().equals("PM")) {
AppointSending(webSocketMessage.getId(), message);
} else {
GroupSending(webSocketMessage.getFromUserId(),message);
}
}
/**
* 群发
* @param message
*/
public void GroupSending(String fromId,String message){
for (String id : sessionPools.keySet()){
try {
if (id.equals(fromId)) {
continue;
}
sessionPools.get(id).session.getBasicRemote().sendText(message);
}catch (Exception e){
e.printStackTrace();
}
}
}
/**
* 指定发送
* @param id
* @param message
*/
public void AppointSending(String id,String message){
try {
sessionPools.get(id).session.getBasicRemote().sendText(message);
}catch (Exception e){
e.printStackTrace();
}
}
}
5、websocket客户端
@Slf4j
public class MyWebSocketClient extends WebSocketClient {
public MyWebSocketClient(URI serverUri) {
super(serverUri);
}
@Override
public void onOpen(ServerHandshake arg0) {
// TODO Auto-generated method stub
log.info("[WebSocket Client] 客户端已连接.");
}
@Override
public void onClose(int arg0, String arg1, boolean arg2) {
// TODO Auto-generated method stub
log.info("[WebSocket Client] 客户端已关闭.{}",arg1);
}
@Override
public void onError(Exception arg0) {
// TODO Auto-generated method stub
log.info("[WebSocket Client] 连接错误.{}",arg0);
}
@Override
public void onMessage(String message) {
Gson gson = new Gson();
WebsocketMessage websocketMessage = gson.fromJson(message, WebsocketMessage.class);
String message1 = websocketMessage.getMessage();
String fromUserId = websocketMessage.getFromUserId();
String toType = websocketMessage.getToType();
String type = "";
if (toType.equals("PM")) {
type = "私发";
} else {
type = "群发";
}
// TODO Auto-generated method stub
log.info("-------- 接收到来自{}的{}消息:" + message1 + "--------",fromUserId,type);
}
}
6、websocket 客户端demo
正常情况下websocket客户端都集成在网页端,这里就不展示网页端的代码了,只展示java的websocket客户端。
这里用三个类模拟了三个客户端。
lisi客户端:用户 lisi 私发消息给 zhangsan,也用于接收私聊或群发的消息
@Slf4j
public class DemoSend {
public static void main(String[] args) {
String currentPersonId = "lisi";
String toPersonId = "zhangsan";
MyWebSocketClient webSocketClient = null;
try {
webSocketClient = new MyWebSocketClient(new URI("ws://127.0.0.1:8080/websocket/" + currentPersonId));
} catch (URISyntaxException e) {
e.printStackTrace();
}
webSocketClient.connect();
// 这里一定要等客户端连接上了服务端再执行后续逻辑操作,否则会报错
while (!webSocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)) {
log.info("正在准备连接... ...");
}
log.info("连接成功!");
Scanner scanner = new Scanner(System.in);
WebsocketMessage websocketMessage = new WebsocketMessage();
websocketMessage.setId(toPersonId);
websocketMessage.setFromUserId(currentPersonId);
websocketMessage.setToType("PM");
while (true) {
System.err.println(currentPersonId+" -> ");
String message = scanner.nextLine();
websocketMessage.setMessage(message);
webSocketClient.send(new Gson().toJson(websocketMessage));
}
}
}
zhangsan客户端:用户 zhangsan 私发消息给 wangwu,也用于接收私聊或群发的消息
@Slf4j
public class DemoSend2 {
public static void main(String[] args) {
String currentPersonId = "zhangsan";
String toPersonId = "wangwu";
MyWebSocketClient webSocketClient = null;
try {
webSocketClient = new MyWebSocketClient(new URI("ws://127.0.0.1:8080/websocket/" + currentPersonId));
} catch (URISyntaxException e) {
e.printStackTrace();
}
webSocketClient.connect();
// 这里一定要等客户端连接上了服务端再执行后续逻辑操作,否则会报错
while (!webSocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)) {
log.info("正在准备连接... ...");
}
log.info("连接成功!");
Scanner scanner = new Scanner(System.in);
WebsocketMessage websocketMessage = new WebsocketMessage();
websocketMessage.setId(toPersonId);
websocketMessage.setFromUserId(currentPersonId);
websocketMessage.setToType("PM");
while (true) {
System.err.println(currentPersonId + " -> ");
String message = scanner.nextLine();
websocketMessage.setMessage(message);
webSocketClient.send(new Gson().toJson(websocketMessage));
}
}
}
wangwu客户端:用户 wangwu 群发消息,也用于接收私聊消息
@Slf4j
public class DemoSend3 {
public static void main(String[] args) {
String currentPersonId = "wangwu";
MyWebSocketClient webSocketClient = null;
try {
webSocketClient = new MyWebSocketClient(new URI("ws://127.0.0.1:8080/websocket/" + currentPersonId));
} catch (URISyntaxException e) {
e.printStackTrace();
}
webSocketClient.connect();
// 这里一定要等客户端连接上了服务端再执行后续逻辑操作,否则会报错
while (!webSocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)) {
log.info("正在准备连接... ...");
}
log.info("连接成功!");
Scanner scanner = new Scanner(System.in);
WebsocketMessage websocketMessage = new WebsocketMessage();
websocketMessage.setFromUserId(currentPersonId);
websocketMessage.setToType("");
while (true) {
System.err.println(currentPersonId + " -> ");
String message = scanner.nextLine();
websocketMessage.setMessage(message);
webSocketClient.send(new Gson().toJson(websocketMessage));
}
}
}
done.