【问题标题】:Java Socket Client sending extra bytes to deviceJava Socket 客户端向设备发送额外的字节
【发布时间】:2012-11-15 20:12:51
【问题描述】:

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

我的代码:

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

outputStream.write(command1);

outputStream.write(command2);

注意command1command2 是字节数组:

  • 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


【解决方案1】:

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

【讨论】:

  • 应用程序永远不会看到额外的 SSL 字节。
【解决方案2】:

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

【讨论】:

  • 好吧,当我用 chilkat 库实现替换 java 套接字时,我的程序工作正常。但只有从 chilkat 套接字更改为 java 套接字才能使我的程序表现得像这样。
  • @zaffarachal 当你用工作代码替换有缺陷的代码时,你的程序运行良好。不足为奇。
猜你喜欢
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多