【发布时间】:2012-11-15 20:12:51
【问题描述】:
目前我正在开发一个将二进制数据命令发送到设备面板的 Java 客户端。我有一个奇怪的问题,如果我为每个套接字连接(一个 TCP 会话)发送一个命令,所有命令都可以正常工作。但是当我在一个连接中发送多个命令(相同的 TCP 会话)时,第一个命令完美地在设备面板上执行,但在第二个命令中,它获得了两个额外的字节,其值为 0x01 和 0x00。很奇怪,这几天我一直在尝试,但找不到答案。
我的代码:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
sslsocket = (SSLSocket) sslsocketfactory.createSocket(deviceIP, port);
//Output Streams
OutputStream outputStream = sslsocket.getOutputStream();
outputStream.write(command1);
outputStream.write(command2);
注意command1 和command2 是字节数组:
- command1 中的值 = 01,01,01
- command2 中的值 = 01,34,45,34,56
设备面板的日志为:
Received command: 01 01 01
Received command: 01 00 01 03 45 34 56
可能是什么问题?您的建议将不胜感激。
【问题讨论】:
-
你能用普通的 TCP(没有 SSL)测试它吗?然后您可以检查 tcpdump 并确定命令是否正确发送。也许这是失败的接收方。
-
不,我不能,因为设备上只打开了 SSL 基本端口,我在写入流之前检查了字节的内容,看起来很完美,但是当我检查设备的日志时,出现了两个字节记录。
-
这个设备如何知道发送的命令的长度?也许您错过了协议中的某些内容?这总是添加 01 00 吗?您是否尝试过更改第一个命令?然后会发生什么?
-
Device protocal 01 表示命令的开始,第二个字节表示数据的长度。因此,如果您分析第一个命令,它是 01(命令的初始化)第二个 01(在这种情况下为 01 的数据长度)和 01(因为单字节数据)。
-
我认为您应该进行一些测试以确保此通信的哪一方失败(您的 Java 应用程序或此设备)。顺便说一句,您是否在每个命令后刷新输出流?您确定没有其他内容写入此流吗?
标签: java sockets tcp embed socket.io