【问题标题】:java.io.EOFException when trying to perform java socket operations尝试执行 java 套接字操作时出现 java.io.EOFException
【发布时间】:2011-10-05 19:59:30
【问题描述】:

下面包含的代码出现以下异常。 当排除 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);
        }
    }


 }

【问题讨论】:

    标签: java sockets serialization


    【解决方案1】:

    你一直试图永远读取对象,永远不会跳出循环。当客户端关闭连接时,流将耗尽数据,ObjectInputStream.readObject 方法将抛出您看到的异常。

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

    【讨论】:

    • +1 快速回复!我想做的是:每个客户端都将启动与服务器的新套接字连接。当在那个连接中时,我希望客户端与服务器进行通信(双向),因为我认为重复连接和断开连接是不必要的。这是一个不好的做法吗? Client 是否总是需要关闭socket,ois,is,oos,os ?
    • @coder9:进行这种交流通常没问题,但您可能需要知道何时停止……我不清楚ObjectInputStream 是否可以轻松地为您提供这些信息。 (我应该警告您,Java 二进制序列化通常在各种方面存在问题 - 如果我是您,我会考虑使用 Protocol Buffers 之类的东西。)
    • 也许我现在应该坚持这个,因为这只是一个学术任务:) 谢谢。
    • @Jon: 怎么可能对 Java 了解这么多却仍然不是你的主要语言?(我已经看到你喜欢 C#)。我正在努力成为一种语言。你是怎么做到的?(总是要求找到提高自己的方法)。
    • @user384706:在这里花费大量时间会有所帮助 - 虽然我喜欢 C#,但我专业使用 Java。我只是 C# 的狂热爱好者 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多