尝试执行 java 套接字操作时出现 java.io.EOFException

标签 java sockets serialization

下面包含的代码出现以下异常。 当排除 while() 循环时,这可以正常工作。这是为什么?

Oct 6, 2011 1:19:31 AM com.mytunes.server.ServerHandler run
SEVERE: null
java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2552)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at com.mytunes.server.ServerHandler.run(ServerHandler.java:68)

ServerHandler 类:

public class ServerHandler extends Thread {
 .
 .
 .

public ServerHandler(...){
...
}


public void run(){

    try {

        os = s.getOutputStream();
        oos = new ObjectOutputStream(os);

        is = s.getInputStream();
        ois = new ObjectInputStream(is);

        while(true){

            msg = (Messenger) ois.readObject(); 

            String methodType = msg.getKey();

            //validating various data passed from the serialized object
            if(methodType.equals("validateCard")){

            } else if(methodType.equals("validatePIN")){

            }

        }

   } catch (SQLException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    } finally{
        try {
            ois.close();
            is.close();
            oos.close();
            os.close();
            s.close();
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }



}

}

类服务器

public class Server{

    ...
    ServerSocket ss;
    ...

    public static void main(String args[]){
        Server server = new Server();
       server.init();

    }

    public void init(){
        try {
            System.out.println("Server started...");

            ss = new ServerSocket(port);

             System.out.println("Listening on " + ss.getInetAddress() + ":" + ss.getLocalPort());

            System.out.println("Waiting for clients...");

            while(true){
                  Socket incoming_socket = ss.accept(); // returns a Socket connection object if received
                  new ServerHandler(...).start();
            }

        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


 }

最佳答案

永远不断尝试读取对象,永远不会跳出循环。当客户端关闭连接时,流将耗尽数据,并且 ObjectInputStream.readObject 方法将引发您所看到的异常。

您预计流中会有多少个对象,为什么要读到它们的末尾?

关于尝试执行 java 套接字操作时出现 java.io.EOFException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7666997/

相关文章:

java - 如何让servlet容器(Tomcat)中断/销毁servlet请求?

C 套接字 : does send wait for recv to end?

java - 指示 Jackson 从给定方法进行序列化

java - 如何真正洗牌

java - Java 中的 Ascii 表

java - 如何将这些 for 语句更改为嵌套 while 语句?

java - 使用多个 HttpURLConnection 并行发送的问题?

通过 Socket 进行 Java TCP 通信

c# - 反序列化 objectstring 将 string 转换为 bool

java - 将java对象序列化到文件时是否可以在序列化文件的开头插入一个对象