【发布时间】:2020-12-31 09:47:36
【问题描述】:
我一直在尝试使用 Java 的 ServerSocket、Socket 和 InputStream 设置一个基本服务器。在读取 InputStream 时,预期的结果是一系列重复的字节 0x0b 和 10 个字节的关联数据(0x0b-data-0x0b-data 重复)。问题是Java应用程序中的某个地方完全丢弃了少量字节,在某些数据包中只留下了9个字节的数据(在使用Wireshark检查后,这些字节存在于原始数据包中,而不是InputStream的输出)。
发生这种情况的背景是为了响应某些行为而快速连续发送大约一百个数据包的序列。我相信这仅仅是因为有更多的字节有机会被丢弃,而不是接收它的速度。
经过一番搜索,我在Java Socket InputStream read missing bytes 发现了同样的问题,但该线程因要求提供更多信息而死掉(因此没有有用的答案)。
导致此问题的全部代码如下。最重要的部分是 while true 循环和 readData 函数(不包括 else if 链)。
为了澄清,问题是这种奇怪行为的原因。
package com.kevycat.minerria;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
public class Minerria {
private static Socket client;
public static void main(String[] args) throws IOException {
ServerSocket socket = new ServerSocket(7777);
System.out.println("Listening");
client = socket.accept();
InputStream stream = client.getInputStream();
System.out.println("Connected");
byte[] extraData = new byte[0];
while (true) {
int available = stream.available();
byte[] data = new byte[available + extraData.length];
stream.read(data, extraData.length, available);
if (extraData.length > 0) {
for (int i = 0; i < extraData.length; i++) {
data[i] = extraData[i];
}
}
if (data.length > 0) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ");
}
System.out.println(" ");
}
if (data.length > 0) {
extraData = readData(data);
}
}
}
private static byte[] readData(byte[] data) throws IOException {
if (data.length < 3) {
return data;
}
int length = data[0] + data[1] * 256;
int type = data[2];
String payload = new String(Arrays.copyOfRange(data, 4, length));
System.out.println(length + " " + type + " " + payload);
if (type == 1) {
client.getOutputStream().write(new byte[] { 5, 0, 3, 0, 0 });
} else if (type == 4) {
client.getOutputStream().write(data);
} else if (type == 5) {
client.getOutputStream().write(data);
} else if (type == 68) {
client.getOutputStream().write(data);
} else if (type == 16) {
client.getOutputStream().write(data);
} else if (type == 42) {
client.getOutputStream().write(data);
} else if (type == 50) {
client.getOutputStream().write(data);
} else if (type == 6) {
byte[] b = new byte[80];
b[0] = 80;
b[2] = 7;
client.getOutputStream().write(b);
} else if (type == 8) {
client.getOutputStream().write(new byte[] { 11, 0, 9, 0, 1, 0, 0, 0, 'e', 'e', 'e' });
}
return data.length > length ? Arrays.copyOfRange(data, length, data.length - 1) : new byte[0];
}
}
【问题讨论】:
标签: java