[英]Java Websocket Client Not Receiving Response from Server
我花了一些时间来浏览堆栈溢出和Google,但可惜我找不到我一直在寻找的东西(可能我错过了一些东西,抱歉。 我非常确定这一切看起来都对,这使我发疯,但是显然出了点问题,我只是看不到。
基本上,握手很好。 我很好地从客户端接收和解析数据包。
当我尝试将成帧的数据包数据发送回客户端时,客户端什么也不做(甚至没有错误)。 我已经使用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
任何帮助将非常感激!
有关将WebSocket客户端库连接到高速公路Websocket协议测试套件的更多详细信息。
http://autobahn.ws/testsuite/manual/#fuzzing
fuzzingserver.json
{
"url": "ws://127.0.0.1:9001",
"options": {"failByDrop": false},
"outdir": "./reports/clients",
"webport": 8080,
"cases": ["*"],
"exclude-cases": [],
"exclude-agent-cases": {}
}
该文件使您可以调整应运行哪些测试用例,端口号等。
启动高速公路模糊测试服务器
$ wstest -m fuzzingserver
在您的客户代码中
答:要求案件数量。
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}
现在,您应该在上面的fuzzingserver.json
指定的路径中具有在磁盘上运行的测试用例的报告。
终于深究了!
尽管握手似乎可以正常工作,但实际上却弄糟了客户端上的缓冲区。
我对客户端的响应是一半,一半来自RFC6455,一半来自HYBI标准,其中握手密钥位于响应的主体中。
这只是一个理论,我没有研究过,但是我相信它在“ \\ r \\ n \\ r \\ n”之后停止读取缓冲区,当我发送消息时,它必须读取的第一件事是accept键第一次离开缓冲区。
"Sec-WebSocket-Accept: " + Utils.generateKey( wsrRequest.socketKey ) + "\r\n" +
"\r\n" + Utils.generateKey( wsrRequest.socketKey );
感谢您的所有帮助,不要担心,因为您对我的Autobahn Test Suite睁开了眼睛!
好奇的是,尽管高速公路没有通过握手解决这个问题,但是镀铬或萤火虫也没有? 可能是个错误?
为什么总是我发现这些东西/叹息
在经过数天的调查并认为我错了之后,上周这是付款服务的一个实际错误,这是该服务没有按照文档所述执行。 幸运的是,由于这个原因,我错了!
无论哪种方式,我都可以继续向前和向上发展。 经过大约一天半的时间后,我确信java搞砸了字节,tcp数据包或Websockets仅适用于非阻塞的全双工套接字连接,而不适用于半双工套接字连接。
我是我自己最大的敌人
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.