org.java-websocket 服务端有客户端连接时,重启服务器端 时websocket 无法启动
相关代码
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.0</version>
</dependency>
WebSocketService
public class WebSocketService {
private WebSocket webSocket;
private Jedis jedis;
private static Logger log = Logger.getLogger(StartWebSocket.class);
public void startWebSocket() {
try {
webSocket = new WebSocket("192.168.55.144", 8888);
//订阅redis消息 开启线程防止阻塞
final RedisSubscriber redisPubSub = new RedisSubscriber();
final JedisDao jedisDao = (JedisDao) Component.getInstance("jedisDao");
jedis = jedisDao.getJedis();
new Thread(new Runnable() {
public void run() {
try {
redisPubSub.subscribe("webSocket", jedis, WebSocketService.this);
} catch (Exception e) {
log.error("Redis Subscribing failed.", e);
}
}
}).start();
webSocket.start();
} catch (Exception e) {
log.error(e);
throw new BusinessException(e);
}
}
}
WebSocket
public class WebSocket extends WebSocketServer {
private static JedisDao jedisDao;
/**
* 保存用户连接和用户id
*/
private static final String urlPrefix = "webSocket";
//单账号多次登录
private static final Map<String, List<WebSocket>> users = new ConcurrentHashMap<>();
public WebSocket(String url, int port) {
super(new InetSocketAddress(url, port));
}
/**
* 关闭链接则删除用户
*
* @param conn
* @param code
* @param reason
* @param remote
*/
@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
}
@Override
public void onError(WebSocket conn, Exception ex) {
ex.printStackTrace();
}
@Override
public void onStart() {
System.out.println("******************webSocket启动成功*****************");
}
/**
* 处理客户端的消息
*
* @param conn
* @param message
*/
@Override
public void onMessage(WebSocket conn, String message) {
// 不需要接收客户端消息
//sendMsgToOne(conn, message);
}
/**
* onOpen():有客户端连接回调,回调参数中有连接WebSocket可用于发送消息,可保存通道用于发送数据
*
* @param conn
* @param handshake
*/
@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
String[] url = handshake.getResourceDescriptor().split("/");
//前缀校验
if (!url[1].equals(urlPrefix)) {
return;
}
List<WebSocket> webSockets = users.get(url[2]);
if (CollectionUtils.isEmpty(webSockets)) {
webSockets = new ArrayList<>();
}
webSockets.add(conn);
users.put(url[2], webSockets);
}
}
当有客户端连接时 重启服务端报错
ERROR (org.java_websocket.server.WebSocketServer:648) - Shutdown due to fatal error
java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.java_websocket.server.WebSocketServer.doSetupSelectorAndServerThread(WebSocketServer.java:533)
at org.java_websocket.server.WebSocketServer.run(WebSocketServer.java:341)
at java.lang.Thread.run(Thread.java:745)
java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.java_websocket.server.WebSocketServer.doSetupSelectorAndServerThread(WebSocketServer.java:533)
at org.java_websocket.server.WebSocketServer.run(WebSocketServer.java:341)
at java.lang.Thread.run(Thread.java:745)
当没有客户端连接时 重启服务端 WebSocketServer可以正常启动