通过 TCP/IP 读取数据包时出错
Error reading packets over TCP/IP
我正在进行一项开发,用于通过 TCP/IP 将一个客户端连接到特定类型的服务器。我正在创建一个代码,用于通过 TCP/IP 发送字节并接收字节。
问题是当我在某个点接收数据包时它中断了。
String input;
Traductor traductor = new Traductor();
PrintWriter writer = new PrintWriter(this.socket.getOutputStream(), true);
// Write a message to server
byte[] theBytesInmediate = new byte[]{0x11, 0x00, 0x14, 0x50, 0x00, 0x01, 0x04, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x7F, (byte) 0x0A, 0x02, (byte)0x2A, 0x00, 0x02, 0x02, 0x31, 0x00};
DataOutputStream salida = new DataOutputStream(this.socket.getOutputStream());
salida.write(theBytesInmediate);
System.out.println("Packet sent");
InputStream input2 = socket.getInputStream();
String tmp ="";
while(true){
DataInputStream entrada = new
DataInputStream(this.socket.getInputStream());
System.out.println("bytes: " + entrada.readByte());
try{
tmp =tmp + entrada.readUTF();
System.out.println("readUTF: " + tmp);
}catch(IOException e){
System.out.println(e);
}
System.out.println("read: " + entrada.read());
System.out.println("readChar: " + entrada.readChar());
System.out.println("readLong: " + entrada.readLong());
}
这是我在控制台中的输出:
一个问题是,当我尝试获取所有数据包时,如果您在图像上看到它损坏了,并且只获取了一部分。
第二个问题,如果我删除这行:
System.out.println("read: " + entrada.read());
System.out.println("readChar: " + entrada.readChar());
System.out.println("readLong: " + entrada.readLong());
获取包停在第一个P blank blank blank, part of packet.
我用 BufferedReader 测试 reader = new BufferedReader(new InputStreamReader(input2));但是读取包不正确
而且我知道数据包不正确,因为我正在使用 Wireshark 检查它。
我需要的数据包的重要部分是告诉 13001 有 mi id。
非常感谢大家。
更新:
感谢 EJP,我的新代码现在可以正常工作,但最后少了一行(我认为)。
PrintWriter writer = new PrintWriter(this.socket.getOutputStream(), true);
byte[] theBytesInmediate = new byte[]{0x11, 0x00, 0x14, 0x50, 0x00, 0x01, 0x04, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x7F, (byte) 0x0A, 0x02, (byte)0x2A, 0x00, 0x02, 0x02, 0x31, 0x00};
DataOutputStream salida = new DataOutputStream(this.socket.getOutputStream());
String str = new String(theBytesInmediate, StandardCharsets.UTF_8);
writer.println(str);
//writer.flush();
System.out.println("Packet sent");
InputStream input2 = this.socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input2));
String tmp ="";
while(true)
{
System.out.println("read: " + reader.readLine().toString());
System.out.println("read: " +reader.read());
}
输出:
如果您在输出中看到缺少最后一个 id 中的 ip 所在的大 paquet。问题不大。但是如果我需要结束while,是需要的。
非常感谢大家。
我会指出一些问题:DataOutputStream 需要 flush() 来确定输出确实被写入。您写入的数据似乎与读取方法和结果不一致。在 UTF P 中是 0x50。 -553882341120 是 FF FF FF 7F 0A 0A 31 00。正确的做法是写入方法与读取方法一致,例如 readLong 应与 writeLong 匹配。
您正在用 readUTF()
阅读,但没有用 writeUTF()
写作。看看Javadoc。 readUTF()
不可能读取用 write()
写入的数据。
您还需要一方面在 Reader
和 Writer
之间做出决定,另一方面在 input/output 流之间做出决定。不要混用。
我正在进行一项开发,用于通过 TCP/IP 将一个客户端连接到特定类型的服务器。我正在创建一个代码,用于通过 TCP/IP 发送字节并接收字节。
问题是当我在某个点接收数据包时它中断了。
String input;
Traductor traductor = new Traductor();
PrintWriter writer = new PrintWriter(this.socket.getOutputStream(), true);
// Write a message to server
byte[] theBytesInmediate = new byte[]{0x11, 0x00, 0x14, 0x50, 0x00, 0x01, 0x04, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x7F, (byte) 0x0A, 0x02, (byte)0x2A, 0x00, 0x02, 0x02, 0x31, 0x00};
DataOutputStream salida = new DataOutputStream(this.socket.getOutputStream());
salida.write(theBytesInmediate);
System.out.println("Packet sent");
InputStream input2 = socket.getInputStream();
String tmp ="";
while(true){
DataInputStream entrada = new
DataInputStream(this.socket.getInputStream());
System.out.println("bytes: " + entrada.readByte());
try{
tmp =tmp + entrada.readUTF();
System.out.println("readUTF: " + tmp);
}catch(IOException e){
System.out.println(e);
}
System.out.println("read: " + entrada.read());
System.out.println("readChar: " + entrada.readChar());
System.out.println("readLong: " + entrada.readLong());
}
这是我在控制台中的输出:
一个问题是,当我尝试获取所有数据包时,如果您在图像上看到它损坏了,并且只获取了一部分。
第二个问题,如果我删除这行:
System.out.println("read: " + entrada.read());
System.out.println("readChar: " + entrada.readChar());
System.out.println("readLong: " + entrada.readLong());
获取包停在第一个P blank blank blank, part of packet.
我用 BufferedReader 测试 reader = new BufferedReader(new InputStreamReader(input2));但是读取包不正确
而且我知道数据包不正确,因为我正在使用 Wireshark 检查它。
我需要的数据包的重要部分是告诉 13001 有 mi id。
非常感谢大家。
更新:
感谢 EJP,我的新代码现在可以正常工作,但最后少了一行(我认为)。
PrintWriter writer = new PrintWriter(this.socket.getOutputStream(), true);
byte[] theBytesInmediate = new byte[]{0x11, 0x00, 0x14, 0x50, 0x00, 0x01, 0x04, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x7F, (byte) 0x0A, 0x02, (byte)0x2A, 0x00, 0x02, 0x02, 0x31, 0x00};
DataOutputStream salida = new DataOutputStream(this.socket.getOutputStream());
String str = new String(theBytesInmediate, StandardCharsets.UTF_8);
writer.println(str);
//writer.flush();
System.out.println("Packet sent");
InputStream input2 = this.socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input2));
String tmp ="";
while(true)
{
System.out.println("read: " + reader.readLine().toString());
System.out.println("read: " +reader.read());
}
输出:
如果您在输出中看到缺少最后一个 id 中的 ip 所在的大 paquet。问题不大。但是如果我需要结束while,是需要的。
非常感谢大家。
我会指出一些问题:DataOutputStream 需要 flush() 来确定输出确实被写入。您写入的数据似乎与读取方法和结果不一致。在 UTF P 中是 0x50。 -553882341120 是 FF FF FF 7F 0A 0A 31 00。正确的做法是写入方法与读取方法一致,例如 readLong 应与 writeLong 匹配。
您正在用 readUTF()
阅读,但没有用 writeUTF()
写作。看看Javadoc。 readUTF()
不可能读取用 write()
写入的数据。
您还需要一方面在 Reader
和 Writer
之间做出决定,另一方面在 input/output 流之间做出决定。不要混用。