2012-11-15 87 views
1

目前我正在开发一个Java客户端,它将二进制数据命令发送到设备面板。我有一个奇怪的问题,如果我每个套接字连接发送一个命令(一个TCP会话),所有命令都可以正常工作。但是,当我在一个连接(相同的TCP会话)中发送多个命令时,第一个命令在设备面板上完全执行,但在第二个命令中,它获得了两个额外的字节值0x010x00。这很奇怪,我过去几天一直在尝试,但找不到答案。Java Socket客户端向设备发送额外的字节

我的代码:

SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
sslsocket = (SSLSocket) sslsocketfactory.createSocket(deviceIP, port); 
//Output Streams 
OutputStream outputStream = sslsocket.getOutputStream(); 

outputStream.write(command1); 

outputStream.write(command2); 

注意command1command2是字节数组:

  • 价值命令1 = 01,01,01
  • 价值命令2 = 01,34,45 ,34,56

设备面板的日志是:

Received command: 01 01 01 
Received command: 01 00 01 03 45 34 56 

可能是什么问题?您的建议将受到高度赞赏。

+0

你可以使用纯TCP(无SSL)进行测试吗?然后你可以检查tcpdump并找出命令是否正确发送。也许这是失败的接受方。 – Kylo

+0

没有我不能,因为设备只有在设备上打开SSL基本端口,我已经检查了字节的内容之前写在流看起来完美,但是当我检查设备的日志有两个字节出现在日志中。 – zaffargachal

+0

该设备如何知道发送的命令的长度?也许你错过了协议中的东西?这总是01 00是添加?你有没有尝试改变这个第一个命令?然后会发生什么? – Kylo

回答

1

我与SSLSocket的Java 6应用程序有同样的问题,服务器在两次写入之间收到额外的字节。 额外的字节是您的SSL连接的CBC保护。 如果您不想要额外的字节,请添加java属性-Djsse.enableCBCProtection = false以禁用CBC保护。

+0

应用程序永远不会看到额外的SSL字节。 – EJP

1

Java和您的操作系统不会添加额外的字节。否则,一半的互联网将无法工作。很显然,设备出现故障或者您错误地观察它。

+0

那么当我用chilkat库实现来替换java套接字时,我的程序工作正常,但只是改变了从chilkat套接字到java套接字的改变,使我的程序表现得像这样。 – zaffargachal

+0

@zaffargachal当你用工作代码替换错误代码时,你的程序工作正常。奇怪。 – EJP

相关问题