我有一个设置了远程客户端的套接字服务器,并且它正常运行。在打开客户端并登录后,我注意到有时,有一个错误似乎是由于客户端在不应该读取int时会发生错误。
登录后,服务器会向客户端发送一系列消息/数据包,这些是从字符串消息到用于在客户端加载变量的信息。
有时,在登录时,会抛出一个错误,表明客户端已读取大小为0或非常大的数据包。在将大号数字转换为ascii后,我曾发现它有点像字符串" sk。" (我在代码中找到了这个字符串,所以它不是完全随机的。)
看看我的代码,我不确定为什么会这样。客户端是否可能在错误的时间读取int?如果是这样,我该如何解决这个问题?
InetAddress address = InetAddress.getByName(host);
connection = new Socket(address, port);
in = new DataInputStream(connection.getInputStream());
out = new DataOutputStream(connection.getOutputStream());
String process;
System.out.println("Connecting to server on "+ host + " port " + port +" at " + timestamp);
process = "Connection: "+host + ","+port+","+timestamp + ". Version: "+version;
write(0, process);
out.flush();
while (true) {
int len = in.readInt();
if (len < 2 || len > 2000) {
throw new Exception("Invalid Packet, length: "+len+".");
}
byte[] data = new byte[len];
in.readFully(data);
for (Byte b : data) {
System.out.printf("0x%02X ",b);
}
try {
reader.handlePackets(data);
} catch (Exception e) {
e.printStackTrace();
//connection.close();
//System.exit(0);
//System.out.println("Exiting");
}
}
//Here is code for my write function (Server sided):
public static void write(Client c, Packet pkt) {
for (Client client : clients) {
if (c.equals(client)) {
try {
out.writeInt(pkt.size());
out.write(pkt.getBytes());
out.flush();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
所以看看写入功能,我真的不知道如何混淆客户端并让它为一个数据包读取数据包的大小两次(至少我认为是这样)正在发生。)
如果您需要更多信息,请问我。
答案 0 :(得分:0)
客户端代码看起来很好,服务器端代码看起来也很好。
最可能的问题是,这是多线程和(不正确)同步的某种问题。例如,可能有两个服务器端线程正在尝试同时将数据包写入同一客户端。
您的Packet
类也可能具有size()
和getBytes()
的不一致实现...或者一个线程正在修改Packet
个对象,而第二个发送它。