通过 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() 写入的数据。

您还需要一方面在 ReaderWriter 之间做出决定,另一方面在 input/output 流之间做出决定。不要混用。