我有三个类,客户端、服务器和处理程序(它将处理服务器连接),如下所示:
// The Client
public void sendSomePackage() {
try {
socket = new Socket("localhost", 54321);
sos = socket.getOutputStream();
oos = new ObjectOutputStream(sockOutput);
} catch (IOException e) {
e.printStackTrace(System.err);
return;
}
// About to start reading/writing to/from socket
try {
Package package = new Package(100);
oos.writeObject(pacote);
} catch (IOException e) {
e.printStackTrace(System.err);
}
try {
Thread.sleep(50);
} catch (Exception e) {
e.printStackTrace();
}
// Done reading/writing to/from socket, closing socket.
try {
sock.close();
} catch (IOException e) {
System.err.println("Exception closing socket.");
e.printStackTrace(System.err);
}
//Exiting
}现在是服务器类:
// The Server - with a method that just wait for connections
public void waitForConnections() {
while (true) {
try {
socket = serverSocket.accept();
// Server:Accepted new socket, creating new handler for it
SimpleHandler handler = new SimpleHandler(socket);
handler.start();
// Server:Finished with socket, waiting for next connection
}
catch (IOException e){
e.printStackTrace(System.err);
}
}
}我的处理程序,它只处理服务器连接:
@Override
public void run() {
//Handler: Handler run() starting
while (true) {
try {
package = (Package) ois.readObject();
if (pacote != null) {
System.out.println("Package received " + pacote.getSourceid());
}
} catch (Exception e) {
e.printStackTrace(System.err);
break;
}
}
try {
// SimpleHandler:Closing socket
sock.close();
ois.close();
} catch (Exception e) {
// Handler: Exception while closing socket, e=" + e);
e.printStackTrace(System.err);
}
}这个想法是客户端发送一些'package‘对象到我的服务器,它将继续运行,随时接收'package’对象。连接工作正常,但在程序的末尾启动了一个异常,如下所示:
Package received 100
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at br.ufscar.socket.SimpleHandler.run(SimpleHandler.java:45)
at java.lang.Thread.run(Unknown Source)我已经在谷歌上搜索了一些东西,但到目前为止还没有。有什么想法吗?
发布于 2011-10-09 07:10:23
这就像你想要的那样工作(可能)。它读取100,然后再次遍历循环( while (true)直到break语句才停止循环),并抛出异常,因为没有更多的数据被发送,它转到catch语句并在退出while循环之前打印错误。
发布于 2011-10-09 22:10:02
EOFException是一个指示流结束的IOException。
发布于 2012-08-17 22:16:24
这里我们说,如果没有更多的字节要读取,那么我们应该在尝试读取对象之前中断while循环,等等。
while (true) {
if (ois.read() == -1) break;
//...rest of the code
}https://stackoverflow.com/questions/7699975
复制相似问题