问题:
场景:
org.java_websocket.exceptions.WebsocketNotConnectedException: null
在使用Java实现websocket客户端时,与服务端通信一直连接不上,提示状态:CLOSING \ NOT_YET_CONNECTED \ CLOSED
使用在线工具测试过后,确保服务端没有问题:
不吝分享,链接在此
http://coolaf.com/tool/chattest
然后开始检查客户端代码:
package com.xx.study.websocket;
import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft_17;
import org.java_websocket.drafts.Draft_75;
import org.java_websocket.handshake.ServerHandshake;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import java.net.URI;
import java.net.URISyntaxException;
@Component
public class MyWebsocketClient {
@Bean
public WebSocketClient webSocketClient() {
try {
URI uri = new URI("ws://192.168.3.2:8090/websocket/test1");
WebSocketClient webSocketClient = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake serverHandshake) {
System.out.println("链接成功。。。");
}
@Override
public void onMessage(String s) {
System.out.println("收到消息:" + s);
}
@Override
public void onClose(int i, String s, boolean b) {
System.out.println("退出链接!");
}
@Override
public void onError(Exception e) {
System.out.println("链接错误:" + e.getMessage());
e.printStackTrace();
}
};
webSocketClient.connect();
// webSocketClient.connectBlocking();
/**
* org.java_websocket.drafts.Draft_10@5489c777
* ws://192.168.3.2:8090/websocket
* /192.168.3.2:62071
* CLOSING
*/
// System.out.println(webSocketClient.getDraft());
// System.out.println(webSocketClient.getURI());
// System.out.println(webSocketClient.getRemoteSocketAddress(webSocketClient.getConnection()));
// System.out.println(webSocketClient.getReadyState());
System.out.println("链接打开。。。");
return webSocketClient;
} catch (URISyntaxException e) {
e.printStackTrace();
return null;
}
}
}
获取webSocketClient.getReadyState()
得到状态后,发现NOT_YET_CONNECTED
,一度认为是连接的问题,于是
考虑到多线程等待返回结果的情况,在这边做了等待处理及各种方式,然而并没有什么l用;
转换思路,从上游重新分析,
进入WebSocketClient构造函数后,发现
public WebSocketClient(URI serverURI) {
this(serverURI, new Draft_10());
}
public WebSocketClient(URI serverUri, Draft draft) {
this(serverUri, draft, (Map)null, 0);
}
public WebSocketClient(URI serverUri, Draft draft, Map<String, String> headers, int connecttimeout) {
this.uri = null;
this.conn = null;
this.channel = null;
this.wrappedchannel = null;
this.connectLatch = new CountDownLatch(1);
this.closeLatch = new CountDownLatch(1);
this.timeout = 0;
this.wsfactory = new DefaultWebSocketClientFactory(this);
this.proxyAddress = null;
if (serverUri == null) {
throw new IllegalArgumentException();
} else if (draft == null) {
throw new IllegalArgumentException("null as draft is permitted for `WebSocketServer` only!");
} else {
this.uri = serverUri;
this.draft = draft;
this.headers = headers;
this.timeout = connecttimeout;
try {
this.channel = SelectorProvider.provider().openSocketChannel();
this.channel.configureBlocking(true);
} catch (IOException var6) {
this.channel = null;
this.onWebsocketError((WebSocket)null, var6);
}
if (this.channel == null) {
this.conn = (WebSocketImpl)this.wsfactory.createWebSocket(this, draft, (Socket)null);
this.conn.close(-1, "Failed to create or configure SocketChannel.");
} else {
this.conn = (WebSocketImpl)this.wsfactory.createWebSocket(this, draft, this.channel.socket());
}
}
}
并不知道Draft10、17、75、76、6455这些版本的草案有什么影响,
然而看着很重要。查了一下资料,
这里看到一份帖,关于websocket的,顺便粘一下:
websocket转自frank_good
很抱歉,没有得到什么有用的信息,这块后面再补充。。。
测试了org.java-websocket的各个版本依赖,从1.3.0 - 1.4.0;
版本测试结果如下:
1.3.0版本
Draft_10
Draft_75
Draft_76
Draft_17(可用)
1.3.4 - 1.4.0
Draft_6455(可用)
解决方案:
使用1.3.4之后版本,Draft_6455
结果:
有问题欢迎留在评论
如果帮助到您,请右上留个赞再走