【发布时间】:2016-03-24 18:53:35
【问题描述】:
我有接收从客户端应用程序发送的 RTMP 数据包的 Java 服务器。服务器使用InputStream 读取packet header,识别packet body 的大小,然后使用size 创建byte array,然后从InputStream 中的array 中读取body。问题是:接收到的字节集被修改 - 有必要的字节(存在于源中)与额外的字节在源中不存在数据包(我通过 WireShark 观察源数据包的内容,并将它们与我在服务器上收到的字节进行比较)。
这些额外的字节是 0xc6 字节,顺便说一下定期会面...
它看起来像这样:Source: ... 75 f1 f5 55 73 .... fc a9 47 14 ... 40 ca d5 75 ... fe 30 a7Received: ... 75 f1 f5 55 73 c6 .... fc a9 47 14 c6 ... 40 ca d5 75 c6 ... fe 30 a7... - 表示“这里有一些字节数”
结果,我无法接收到必要的数据,因为它被拉伸了,比我从 rtmp header 收到的 body size 大。最重要的是,修改后的数据不是我必须收到的!
我的问题是:如何修复? InputStream 怎么了?为什么它将那些 0xc6 字节插入接收数组?
我知道我可以简单地解析接收到的数组并排除那些额外的字节,但这是一个糟糕的解决方案,因为速度和性能是必需的(并且,在这种情况下,不清楚它是来自源的额外字节或字节,没有比较整个数组)...
enter code here
public static void getRtmpPacket(InputStream in) throws Exception {
byte[] rtmpHeader = new byte[8];
byte[] rtmpBody;
int bodySize = 0;
//reading rtmp header:
in.read(rtmpHeader);
//reading the body size. This method works fine
bodySize = Server.bigEndianBytesToInt(rtmpHeader, 4, 3);
rtmpBody = new byte[bodySize];
in.read(rtmpBody);
//printing received data:
System.out.println("Packet:");
System.out.println("Body size: " + bodySize);
System.out.print(bytesToString(rtmpHeader) + " ");
System.out.print(bytesToString(rtmpBody));
System.out.println();
}
【问题讨论】:
-
请输入代码。最好简化为minimal reproducible example。
-
InputStream从不这样做。如果是这样,则意味着源的绑定没有您想象的那么好。 -
这不可信。显然,您在他的 cod 中存在您尚未发布的错误,例如
bytesToString()。
标签: java sockets stream byte inputstream