<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.4</version>
</dependency>
maven-repository\org\java-websocket\Java-WebSocket\1.3.4\Java-WebSocket-1.3.4.jar
package com.dhcc.project.evaluate.websocket.server;
import com.dhcc.common.utils.bean.SpringContextUtil;
import com.dhcc.framework.redis.RedisCache;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import java.net.InetSocketAddress;
import java.util.concurrent.CopyOnWriteArraySet;
@Slf4j
public class EvaluateWebSocketServer extends org.java_websocket.server.WebSocketServer {
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象
CopyOnWriteArraySet<WebSocket> connections = new CopyOnWriteArraySet();
public EvaluateWebSocketServer(int port) {
super(new InetSocketAddress(port));
}
@Override
public void onOpen(WebSocket conn, ClientHandshake clientHandshake) {
RedisCache redisTemplate = SpringContextUtil.getBean(RedisCache.class);
conn.send("客户端与服务器握手成功了,开始聊天吧");
// 新连接开启时,可以在这里添加逻辑,例如记录连接信息到Redis
connections.add(conn);
//conn.getRemoteSocketAddress().toString();
//String userName = clientHandshake.getFieldValue("userName");
//log.info("用户:{}连接成功",userName);
String pathParam = clientHandshake.getResourceDescriptor();
log.info("pathParam: {}",pathParam);
redisTemplate.getRedisTemplate().opsForHash().put("websockets", conn.getRemoteSocketAddress().toString(), "connected");
}
@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
log.info("关闭会话,原因:"+code+" : "+reason);
RedisCache redisTemplate = SpringContextUtil.getBean(RedisCache.class);
redisTemplate.getRedisTemplate().opsForHash().delete("websockets", conn.getRemoteSocketAddress().toString());
connections.remove(conn);
}
@Override
public void onMessage(WebSocket conn, String s) {
//根据指令s做不同的处理
//webSocket.send("收到指令:"+s);
broadcast(s);
}
@Override
public void onError(WebSocket webSocket, Exception e) {
log.error("服务端错误信息",e);
}
@Override
public void onStart() {
log.info("服务已启动");
}
// 向所有连接的客户端广播消息
private void broadcast(String message) {
RedisCache redisTemplate = SpringContextUtil.getBean(RedisCache.class);
for (WebSocket conn : connections) {
redisTemplate.getRedisTemplate().opsForHash().get("websockets", conn.getRemoteSocketAddress().toString());
conn.send("群发回复: "+message);
}
}
}
启动服务端
new EvaluateWebSocketServer(5004).start();
客户端
package com.dhcc.project.evaluate.websocket.client;
import cn.hutool.system.oshi.OshiUtil;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
@Slf4j
public class EvaluateWebsocketClient extends WebSocketClient {
public static EvaluateWebsocketClient getInstance(URI serverUri){
return new EvaluateWebsocketClient(serverUri);
}
/**
* Constructs a WebSocketClient instance and sets it to the connect to the
* specified URI. The channel does not attampt to connect automatically. The connection
* will be established once you call <var>connect</var>.
*
* @param serverUri the server URI to connect to
*/
public EvaluateWebsocketClient(URI serverUri) {
super(serverUri);
}
@Override
public void onOpen(ServerHandshake handshakedata) {
log.info("websocket客户端与服务端握手结果:{} : {}",handshakedata.getHttpStatus(),handshakedata.getHttpStatusMessage());
super.getConnection().send("我是客户端"+ OshiUtil.getOs().getFamily()+OshiUtil.getOs().getVersionInfo()+",欢迎你!");
}
@Override
public void onMessage(String message) {
log.info("服务器回复说: {}",message);
}
@Override
public void onClose(int code, String reason, boolean remote) {
log.info("关闭原因: {}:{}",code,reason);
}
@Override
public void onError(Exception ex) {
log.error("",ex);
}
}
启动客户端
EvaluateWebsocketClient.getInstance(URI.create(wsUrl)).connect();