Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试执行java套接字操作时出现java.io.EOFException_Java_Sockets_Serialization - Fatal编程技术网

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

尝试执行java套接字操作时出现java.io.EOFException,java,sockets,serialization,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.Obje

下面包含的代码有以下异常当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
方法将抛出您看到的异常


您希望流中有多少个对象,为什么要读到这些对象的末尾?

+1快速回答!我想做的是:每个客户机将启动与服务器的新套接字连接。在连接内部时,我希望客户端与服务器通信(双向),因为我认为重复连接和断开连接是不必要的。这是个坏习惯吗?客户端是否总是需要关闭套接字ois、is、oos、os?@coder9:进行这种通信通常是可以的,但您可能需要知道何时停止。。。我不清楚
ObjectInputStream
是否能轻松地为您提供这些信息。(我应该警告你,java二进制序列化通常有各种各样的问题,如果我是你,我会考虑一些协议缓冲区。)也许我现在应该坚持下去,因为这只是一个学术任务:谢谢。乔恩:怎么可能知道这么多java,仍然不是你的主要语言?(我看到你对C#很感兴趣。我只是在努力精通一门语言。你是怎么做到的?(总是问自己如何提高自己)。@user384706:花大量时间在这里会有帮助——尽管我喜欢C#,但Java是我专业使用的语言。我只是C#的一个狂热业余爱好者:)