在 android 中无法将 websocket 与 wss 连接
Unable to connect websocket with wss in android
我正在尝试使用 org.java_websocket.client.WebSocketClient API 连接 android 中的安全 websocket 连接 wss://,但无法连接 https。但是它与 ws://.. 一起工作正常。这是我的代码。
private void connect(String websocketEndPointUrl) throws Exception {
URI uri;
try {
websocketEndPointUrl="wss://echo.websocket.org:443";
Log.i(TAG, " WSURL: " + websocketEndPointUrl);
uri = new URI(websocketEndPointUrl);
} catch (URISyntaxException e) {
Log.e(TAG, e.getMessage());
return;
}
mWebSocketClient = new WebSocketClient(uri,new Draft_17()) {
@Override
public void onOpen(ServerHandshake serverHandshake) {
Log.i("Websocket", "Opened");
}
@Override
public void onMessage(String s) {
//final String message =s;
}
@Override
public void onClose(int i, String s, boolean b) {
Log.i("Websocket", "Closed " + s);
}
@Override
public void onError(Exception e) {
Log.i("Websocket", "Error " + e.getMessage());
}
};
mWebSocketClient.connect();
}
我正在使用在线测试 websocket url:
ws://echo.websocket.org (port 80) // 使用它
wss://echo.websocket.org(端口 443)
根据我的观察,我的代码中不需要证书。谁能告诉我这是什么原因以及我该如何解决这个问题。
找到解决办法。我不知道为什么这不是文档的一部分。您只需要在 WebSocketClient 初始化之后和 .connect()
方法
之前设置 setWebSocketFactory
mWebSocketClient = new WebSocketClient(uri,new Draft_17())
{
@Override
public void onOpen(ServerHandshake serverHandshake) {
Log.i("Websocket", "Opened");
}
@Override
public void onMessage(String s) {
//final String message =s;
}
@Override
public void onClose(int i, String s, boolean b) {
Log.i("Websocket", "Closed " + s);
}
@Override
public void onError(Exception e) {
Log.i("Websocket", "Error " + e.getMessage());
}
};
if (websocketEndPointUrl.indexOf("wss") == 0)
{
try {
SSLContext sslContext = SSLContext.getDefault();
mWebSocketClient.setWebSocketFactory(new DefaultSSLWebSocketClientFactory(sslContext));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
mWebSocketClient.connect();
就我而言,当 websocket connect()
:
时,我需要两件事来修复 "Trust anchor for certification path not found" 错误
HttpsURLConnection
请求特定的 wss 主机(但以 https://
形式)至少成功一次。
- 然后
setWebSocketFactory()
按照接受的答案中提到的那样做。这个额外的方法(加上new Draft_17()
)只出现在库版本org.java-websocket:Java-WebSocket:1.3.0
,而不是1.4.0
。
请注意,不要像 this answer 那样用 allowAllSSL()
进行测试,这会影响上述两件事不起作用。
我正在尝试使用 org.java_websocket.client.WebSocketClient API 连接 android 中的安全 websocket 连接 wss://,但无法连接 https。但是它与 ws://.. 一起工作正常。这是我的代码。
private void connect(String websocketEndPointUrl) throws Exception {
URI uri;
try {
websocketEndPointUrl="wss://echo.websocket.org:443";
Log.i(TAG, " WSURL: " + websocketEndPointUrl);
uri = new URI(websocketEndPointUrl);
} catch (URISyntaxException e) {
Log.e(TAG, e.getMessage());
return;
}
mWebSocketClient = new WebSocketClient(uri,new Draft_17()) {
@Override
public void onOpen(ServerHandshake serverHandshake) {
Log.i("Websocket", "Opened");
}
@Override
public void onMessage(String s) {
//final String message =s;
}
@Override
public void onClose(int i, String s, boolean b) {
Log.i("Websocket", "Closed " + s);
}
@Override
public void onError(Exception e) {
Log.i("Websocket", "Error " + e.getMessage());
}
};
mWebSocketClient.connect();
}
我正在使用在线测试 websocket url: ws://echo.websocket.org (port 80) // 使用它 wss://echo.websocket.org(端口 443) 根据我的观察,我的代码中不需要证书。谁能告诉我这是什么原因以及我该如何解决这个问题。
找到解决办法。我不知道为什么这不是文档的一部分。您只需要在 WebSocketClient 初始化之后和 .connect()
方法
mWebSocketClient = new WebSocketClient(uri,new Draft_17())
{
@Override
public void onOpen(ServerHandshake serverHandshake) {
Log.i("Websocket", "Opened");
}
@Override
public void onMessage(String s) {
//final String message =s;
}
@Override
public void onClose(int i, String s, boolean b) {
Log.i("Websocket", "Closed " + s);
}
@Override
public void onError(Exception e) {
Log.i("Websocket", "Error " + e.getMessage());
}
};
if (websocketEndPointUrl.indexOf("wss") == 0)
{
try {
SSLContext sslContext = SSLContext.getDefault();
mWebSocketClient.setWebSocketFactory(new DefaultSSLWebSocketClientFactory(sslContext));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
mWebSocketClient.connect();
就我而言,当 websocket connect()
:
HttpsURLConnection
请求特定的 wss 主机(但以https://
形式)至少成功一次。- 然后
setWebSocketFactory()
按照接受的答案中提到的那样做。这个额外的方法(加上new Draft_17()
)只出现在库版本org.java-websocket:Java-WebSocket:1.3.0
,而不是1.4.0
。
请注意,不要像 this answer 那样用 allowAllSSL()
进行测试,这会影响上述两件事不起作用。