【问题标题】:Unable to connect websocket with wss in android无法在android中将websocket与wss连接起来
【发布时间】:2016-07-09 02:10:44
【问题描述】:

我正在尝试使用 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) 根据我的观察,我的代码中不需要证书。谁能建议我是什么原因以及如何解决这个问题。

【问题讨论】:

    标签: java android websocket android-webservice


    【解决方案1】:

    就我而言,当 websocket connect():

    1. HttpsURLConnection 至少一次成功地请求特定的 wss 主机(但以 https:// 形式)。
    2. 然后按照接受的答案中所述执行setWebSocketFactory()。这个额外的方法(加上new Draft_17())只出现在库版本org.java-websocket:Java-WebSocket:1.3.0,而不是1.4.0

    注意不要像this answer那样使用allowAllSSL()进行测试,这会影响上面的两件事不起作用。

    【讨论】:

      【解决方案2】:

      找到解决方案。我不知道为什么这不是文档的一部分。您只需要在 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();
      

      【讨论】:

      • 这太疯狂了。我已经搜索了整个互联网以找到这个技巧。还是谢谢。
      • @Azade WebSocketClient 的包是什么?
      • @WISHI 导入 o​​rg.java_websocket.client.WebSocketClient; Gradle Dependency: implementation "org.java-websocket:Java-WebSocket:1.3.0" 上述代码所需的其他包(仅供参考): import org.java_websocket.client.DefaultSSLWebSocketClientFactory;导入 org.java_websocket.client.WebSocketClient;导入 org.java_websocket.handshake.ServerHandshake;导入 java.net.URI;导入 java.net.URISyntaxException;导入 java.security.NoSuchAlgorithmException;导入 javax.net.ssl.SSLContext;
      猜你喜欢
      • 2019-05-28
      • 2015-02-14
      • 2014-07-06
      • 2021-09-28
      • 1970-01-01
      • 2012-09-14
      • 2012-10-19
      • 2015-12-18
      • 1970-01-01
      相关资源
      最近更新 更多