java.io.StreamCorruptedException:流标头无效

java.io.StreamCorruptedException:流标头无效,java,sockets,Java,Sockets,我正在编写一个套接字客户机,其中我使用getOutputStream向服务器发送数据,下面是我的代码 this.wr = this.socket.getOutputStream(); wr.write(hexStringToByteArray(messageBody)); wr.flush(); 以上是成功发送数据。 1但是当我尝试使用 this.in = new ObjectInputStream(this.socket.getInputStream()); 因为我不知道服务器

我正在编写一个套接字客户机,其中我使用getOutputStream向服务器发送数据,下面是我的代码

 this.wr = this.socket.getOutputStream();

  wr.write(hexStringToByteArray(messageBody));

wr.flush(); 
以上是成功发送数据。 1但是当我尝试使用

this.in = new ObjectInputStream(this.socket.getInputStream());
因为我不知道服务器返回的是什么格式。这一行有错误

java.io.StreamCorruptedException:流标头无效

我不知道为什么?我知道我将接收的值将采用十六进制格式,即 假设600185和600186一样

谁能帮我克服这个错误

2另外,如果我在一定时间后没有收到任何响应,如何关闭套接字连接


提前感谢大家。

ObjectInputStream希望流中有一个由ObjectOutputStream编写的头。所以,如果你使用一个,你需要同时使用两个

由于您的示例并不真正需要ObjectOutputStream,您可能只想不使用ObjectInputStream

比如:

public void doWrite(Socket socket, String messageBody) {
    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    byte[] data = hexStringToByteArray(messageBody);

    dos.writeInt(data.length);
    dos.write(data);
    dos.flush();
}

public String doRead(Socket socket) throws IOException {
    DataInputStream dis = new DataInputStream(socket.getInputStream());
    int len = dis.readInt();
    byte[] data = new byte[len];

    dis.read(data);

    return byteArrayToHexString(data);
}

因此,我将如何阅读服务器的响应,以及任何建议。我刚刚尝试使用this.in=this.socket.getInputStream;,System.out.printlnith.in.read;但是没有得到期望的结果。您正在编写一个字节数组。因此,在读取时,您可能需要知道要读取的数组有多大,因此我会首先写入数组的长度,然后写入数组。读取时,读取长度,然后读取数组。要将整数写入流,请使用DataOutputStream包装流,并在读取时使用DataInputStream包装流。您可以使用DataOutputStream.writeInt和DataInputStream.readInt。要读取数组,请执行readarray;根据之前读取的大小分配阵列后。谢谢,但是是否有任何方法可以动态知道我要读取的大小,因为我不确定服务器可能响应的大小。还有,如果我没有收到任何响应,套接字连接应该关闭以避免大量打开的连接。我尝试使用您提供的代码,我不确定哪里出了问题,但我的eclipse被挂起并检查了进程是否正在进行。所以我不得不终止它。我尝试了InputStream,我得到了预期的结果,但是,我需要根据服务器大小初始化字节数组,这里我失败了,因为我不知道大小会有多大be@MeByFatGuy,感谢您提供示例代码。在同样的问题上帮助了我。我没有先看长度,这就是为什么我会有那个错误+1.