Java Websocket客户端未收到来自服务器的响应

时间:2013-12-04 16:33:20

标签: java websocket response

我花了一些时间在堆栈溢出和谷歌搜索,但唉,我无法找到我一直在寻找的东西(可能有一些我错过了,抱歉,如果有的话)。这让我感到疯狂,因为我确信它看起来都很正确,但显然出现了问题,而我却看不到它。

基本上,握手很好。 我从客户端收到并解析数据包。

当我尝试将带帧的数据包发送回客户端时,客户端什么都不做(甚至没有错误)。我使用echo.websocket.org上的示例和我自己编写的javascript对象在最新的Firefox和Chrome浏览器上尝试过。我可以在客户端和服务器上看到通过Wireshark发送和接收的数据包。

以下是我根据RFC 6455标准发送的内容和数据包细分的示例。

        Entire Response Packet Sent : 
            00 16 d3 65 d0 50 f4 6d 
            04 00 5f 84 08 00 45 00 
            00 32 5f e3 40 00 80 06 
            17 8c c0 a8 01 02 c0 a8 
            01 04 1f 91 05 18 fd 56 
            6f 03 ea 17 6d 4c 50 18 
            01 00 c0 fa 00 00 81 84 
            b2 3f de 11 83 0d ed 25

        Payload Data Unmasked Should Read : 1234

        Data : 
            81 84 B2 3F DE 11 83 0D ED 25

            FIN, RSV 1-3 and Op Code :

            0x81    1000 0001
                FIN     1 
                RSV1    0
                RSV2    0
                RSV3    0
                Opcode  1

            Mask and Payload Length :

            0x84    1000 0100
                Mask    1
                Length  4

            Mask Key :

            0xB2    1011 0010
            0x3F    0011 1111
            0xDE    1101 1110
            0x11    0001 0001

            Masked Payload Data : 

            0x83    1000 0011
            0x0D    0000 1101
            0xED    1110 1101
            0x25    0010 0101

            Unmasked Data

            Binary          Decimal         Hex         UTF-8

            1011 0010  
            1000 0011 ^
            -----------
            0011 0001       49              31          1

            0011 1111 
            0000 1101 ^
            -----------
            0011 0010       50              32          2

            1101 1110
            1110 1101 ^
            -----------
            0011 0011       51              33          3

            0001 0001 
            0010 0101 ^
            -----------
            0011 0100       52              34          4

我的整个代码库都在GitHub上,但这里是核心文件:

数据框架结构: https://github.com/willitscale/simplejavawebsocket/blob/master/java/src/uk/co/n3tw0rk/websocketregistration/framing/DataFrame.java

数据框响应生成器: https://github.com/willitscale/simplejavawebsocket/blob/master/java/src/uk/co/n3tw0rk/websocketregistration/framing/DataFrameResponse.java

客户端套接字连接线程: https://github.com/willitscale/simplejavawebsocket/blob/master/java/src/uk/co/n3tw0rk/websocketregistration/threads/SocketClient.java

整个存储库:https://github.com/willitscale/simplejavawebsocket

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

关于将WebSocket客户端库连接到高速公路websocket协议测试套件的更多细节。

http://autobahn.ws/testsuite/manual/#fuzzing

  1. 为自己制作规范fuzzingserver.json
  2. {
       "url": "ws://127.0.0.1:9001",
    
       "options": {"failByDrop": false},
       "outdir": "./reports/clients",
       "webport": 8080,
    
       "cases": ["*"],
       "exclude-cases": [],
       "exclude-agent-cases": {}
    }
    

    此文件允许您调整应运行的测试用例,端口号等等。

    1. 启动高速公路模糊测试服务器

      $ wstest -m fuzzingserver

    2. 在您的客户端代码中

      A:请求案件数量。

      ws://localhost:9001/getCaseCount

      您将收到一条TEXT消息,一个表示测试用例数的整数

      B:连接并运行特定的测试用例(按编号)

      ws://localhost:9001/runCase?case={case_number}&agent={library-name}

      确保回显收到的任何完整的TEXT或BINARY消息。

      C:生成报告

      ws://localhost:9001/updateReports?agent={library-name}

    3. 您现在应该在上面的fuzzingserver.json指定的路径中有关于您在磁盘上运行的测试用例的报告

答案 1 :(得分:0)

终于到了最底层!

虽然握手似乎有效但它实际上搞砸了客户端上的缓冲区。

我对客户的回复是一半,一半来自RFC6455,另一半来自HYBI标准,其中握手密钥位于响应主体中。

这只是一个理论,我没有调查它,但我相信它在“\ r \ n \ r \ n”之后停止读取缓冲区,当我发送一条消息时,首先必须读取的是第一次从缓冲区遗留下来的接受键。

            "Sec-WebSocket-Accept: " + Utils.generateKey( wsrRequest.socketKey ) + "\r\n" +
            "\r\n" + Utils.generateKey( wsrRequest.socketKey );

感谢您的所有帮助,不要害怕,因为您已经睁开眼睛看着高速公路测试套件,所以不会有任何帮助!

虽然很高兴但是高速公路没有通过握手来解决这个问题,也没有镀铬或萤火虫?也许是一个错误?

为什么我总能找到这些东西/叹息

上周这是一个支付服务的实际错误,经过几天的调查和认为我错了,这是服务没有做文件所说的。幸运的是,我错了!

无论哪种方式,向前和向上,我终于可以继续我的发展。大约一天半后,当我确信java搞砸了字节时,tcp数据包或Websockets只能用于非阻塞全双工套接字连接而不是半双工套接字连接。

我是我自己最大的敌人