尝试执行java套接字操作时出现java.io.EOFException
下面包含的代码有以下异常当while()循环被排除时,这种方法可以正常工作。为什么会这样尝试执行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
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#的一个狂热业余爱好者:)