我花了一些时间在堆栈溢出和谷歌搜索,但唉,我无法找到我一直在寻找的东西(可能有一些我错过了,抱歉,如果有的话)。这让我感到疯狂,因为我确信它看起来都很正确,但显然出现了问题,而我却看不到它。
基本上,握手很好。 我从客户端收到并解析数据包。
当我尝试将带帧的数据包发送回客户端时,客户端什么都不做(甚至没有错误)。我使用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
任何帮助将不胜感激!
答案 0 :(得分:2)
关于将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
在您的客户端代码中
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}
您现在应该在上面的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只能用于非阻塞全双工套接字连接而不是半双工套接字连接。
我是我自己最大的敌人