【问题标题】:java.io.StreamCorruptedException: invalid stream header: 54657374java.io.StreamCorruptedException:无效的流标头:54657374
【发布时间】:2014-04-24 07:09:49
【问题描述】:

我正在尝试使用Socket程序读取从客户端发送的字符串,代码如下:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.ClassNotFoundException;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServerExample {

    //static ServerSocket variable
    private static ServerSocket server;
    //socket server port on which it will listen
    private static int port = 5000;

    public static void main(String args[]) throws IOException, ClassNotFoundException{
        //create the socket server object
        server = new ServerSocket(port);
        //keep listens indefinitely until receives 'exit' call or program terminates
        while(true){
            System.out.println("Waiting for client request");
            //creating socket and waiting for client connection
            Socket socket = server.accept();
            //read from socket to ObjectInputStream object
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            //convert ObjectInputStream object to String
            String message = (String) ois.readObject();
            System.out.println("Message Received: " + message);
            //create ObjectOutputStream object
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            //write object to Socket
            oos.writeObject("Hi Client "+message);
            //close resources
            ois.close();
            oos.close();
            socket.close();
            //terminate the server if client sends exit request
            if(message.equalsIgnoreCase("exit")) break;
        }
        System.out.println("Shutting down Socket server!!");
        //close the ServerSocket object
        server.close();
    }

}

但是在从客户端读取字符串时出现如下错误:

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 54657374
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:803)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
    at SocketServerExample.main(SocketServerExample.java:29)

我搜索并没有找到错误。请帮帮我。

【问题讨论】:

标签: java


【解决方案1】:

很明显,您没有使用ObjectOutputStream: 发送数据,您只是在写入字节。

  • 如果你用readObject()阅读,你必须用writeObject().写作
  • 如果你用readUTF()阅读,你必须用writeUTF().写作
  • 如果您使用readXXX() 阅读,则必须使用writeXXX(), 编写大多数XXX 值。

【讨论】:

  • @androidsuckzzz 要读取 ObjectInputStream,您必须写入 ObjectOutputStream(或者您必须执行与它相同的操作,我不建议您尝试)。您不能只写入任何流并假设它会起作用。
  • @SrujanBarai 不,你不是。您直接发送"Test",否则您不会收到此错误。
【解决方案2】:

您不能指望ObjectInputStream 自动将文本转换为对象。十六进制 54657374"Test" 作为文本。您必须直接将其作为字节发送。

【讨论】:

  • 您好,我正在将字节直接从我的 cpp 客户端发送到 java 服务器。在这种情况下如何阅读? iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0); -- 用于发送的 cpp 客户端代码。
  • @Haramoz 您还应该发送长度,否则每个流只能发送一条消息。我会使用带有原生有序数据的 ByteBuffer 阻塞 NIO。
猜你喜欢
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多