Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中Websocket握手失败_Java_Websocket_Handshake - Fatal编程技术网

在Java中Websocket握手失败

在Java中Websocket握手失败,java,websocket,handshake,Java,Websocket,Handshake,所以,我试图解析一个使用websocket向客户端发送数据的网站。根据我所读到的: 我知道为了创建连接,我需要向服务器发送一个特殊的http请求,ot将检索一些我用来访问通道的数据 我所做的: 创建了http请求 `URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // optional default is GET con.setRequestMetho

所以,我试图解析一个使用websocket向客户端发送数据的网站。根据我所读到的:

我知道为了创建连接,我需要向服务器发送一个特殊的http请求,ot将检索一些我用来访问通道的数据

我所做的:

  • 创建了http请求

    `URL obj = new URL(url);
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    
    // optional default is GET
    con.setRequestMethod("GET");
    
    //add request header
    con.setRequestProperty("Cache-Control", "no-cache");
    con.setRequestProperty("Host", "www.example.com");
    con.setRequestProperty("Upgrade", "websocket");
    con.setRequestProperty("Connection", "upgrade");
    con.setRequestProperty("Origin", "https://example.com");
    con.setRequestProperty("Sec-WebSocket-Extensions", "x-webkit-deflate-frame");
    con.setRequestProperty("Sec-WebSocket-Key", "QkWkChtTGpaZL5PkOMaRtg==");
    con.setRequestProperty("Sec-WebSocket-Version", "13");
    con.setRequestProperty("User-Agent", "Mozilla/..;
    
    `

我读了代码为200的回复(而不是应该是101)

问题:

  • 如何生成Sec Websocket密钥?(示例中取自firebug,实际上是所有标题)
  • 1.1。还有什么可以做得更多

    1.2。必须使用来自http的相同链接才能访问websocket?仅使用wss而不是https

    • 在此之后,我尝试将客户端连接到服务器,并使用onMessage方法接收消息

      WebSocketContainer=ContainerProvider.getWebSocketContainer();
      Session Session=container.connectToServer(ClientEndpoint.class,buildCEC(),新URI(“wss://async.example.com/socket.io/1/?t=“+System.currentTimeMillis())

    • 我尝试在buildCec()中插入到服务器连接的头。
      
      ClientEndpointConfig config=ClientEndpointConfig.Builder.create().build();
      Configurator conf=config.getConfigurator();
      

      `Map headers=newhashmap();
      headers.put(“连接”、Arrays.asList(“保持活动”、“升级”);
      headers.put(“Sec Websocket扩展”,Arrays.asList(“x-webkit-deflate-frame”);
      headers.put(“Sec Websocket键”,Arrays.asList(“cx36sHrtuW9HZAaB6kKa/Q==”);
      headers.put(“Sec Websocket版本”,Arrays.asList(“13”);
      headers.put(“升级”,Arrays.asList(“websocket”);
      headers.put(“用户代理”、Arrays.asList(“Mozill…”);
      conf.beforeRequest(标题);
      返回配置`
      
    问题

  • 如果我计算出来并从http升级请求中收到101状态代码,我的判断是否正确?(我的意思是,我接下来如何处理这些细节?)
  • 请不要评判我,我刚开始使用java中的websockets,我对javascript不太了解,我想用jsr-356用纯java开发这个客户机。我已经用WebSocket做了一些小例子,但是我找不到一个好的客户端,它有标题和更复杂的握手
  • 在不知道所有细节的情况下,是否可以连接到未知服务器
  • 我正在使用一个编程端点并导入javax.websocket.ContainerProvider;用于处理来自jsr356的websocket连接。

    这里有很多主题

  • 不要将URLHttpConnection用于WebSocket,它基于HTTP语义管理输出/输入流,不处理升级的连接。使用标准插座
  • 阅读
  • RFC6455中多次提到了
    Sec WebSocket键
    ,它有一个总体目的,即让客户端证明它从服务器收到了有效的密钥。客户端有规则,服务器端有规则,它应该如何处理它,以及如何响应它。(简言之,它是一个随机值,客户机拾取并发送给服务器,服务器在此步骤中附加RFC指定的GUID,计算SHA-1散列,并在其自己的
    Sec WebSocket Key
    中使用该散列进行响应,客户机验证该散列以确认服务器确实具有WebSocket功能)
  • 仔细阅读本节,特别是关于3种形式的有效负载长度的部分(您必须实现对所有3种形式的支持,因为服务器需要规则来验证这一点)“-请参阅关于这一点的其他答案-
  • 至于,您不能调用这些方法。在建立连接的过程中,JSR-356WebSocket服务器实现会调用这些函数。请参阅我关于此过程的其他答案-
  • 请注意框架验证规则-
  • 我知道有几个JSR-356独立客户端

    
    org.eclipse.jetty.websocket
    
    
    
    
    org.apache.tomcat
    
    
    
    
    org.glassfish.grizzly
    
    
    
    
    org.glassfish.tyrus.bundles
    
    (每一个编写针对这个测试套件的实现测试的人,它有点成为事实上的协议验证套件)

    我认为以下是您需要的:

     String secAccept = sha1base64(secKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
    
     private String sha1base64(String str) {
            MessageDigest md = null;
            try {
                md = MessageDigest.getInstance("SHA-1");
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            return Base64.encode(md.digest(str.getBytes()));
        }
    

    我认为使用一些客户端库会更容易。谷歌搜索:我想先了解他们创建WebSocket概念的基础知识,然后再使用一个库。不管怎样,我还是要看一看。将来,你可能会想把这么多的主题问题分成几个单独的问题。谢谢你这么详细的回答。我会回顾你告诉我的,并让你知道。你好,我再次阅读了你给我的所有内容,我已经实现了一个小例子,但现在我想解析真实的站点。我使用了Jetty客户端,一开始一切似乎都正常,握手会给出200个状态码和所有信息。但当我尝试建立连接时,它仍处于挂起状态。我要分析的站点使用以下内容:。我遵循了本文档中的所有步骤,但运气不佳。当尝试建立真正的连接时,它仍处于挂起状态。你知道服务器有某种接受吗?它适用于“ws://echo.websocket.org”,更具体地说,当我说接受时,我指的是某种标题。你的问题似乎是一长串“…哦,还有另一件事…”。IO不是websocket,它是websocket顶部的一个复杂层。你的问题是关于websocket的。就这个新问题再问一个问题。不要沾沾自喜地回答老问题。Stackoverflow不是一个持续对话的论坛,它是一个问答网站。
     String secAccept = sha1base64(secKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
    
     private String sha1base64(String str) {
            MessageDigest md = null;
            try {
                md = MessageDigest.getInstance("SHA-1");
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            return Base64.encode(md.digest(str.getBytes()));
        }