JAVA 是什么导致网络套接字上的流结束?
JAVA what causes end of stream on network sockets?
根据我的理解,end of stream
的全部意义在于告诉输入流何时停止读取数据,这在文件流中是有意义的,但是当它是一个 ObjectInputStream
为什么我要如果我将来可能会发送另一个对象,它会停止读取对象。
在我的例子中,ObjectInputStream
每当它决定有什么东西导致流结束时抛出一个 EOFException
。
代码段:
发送中:
public synchronized void sendCommand(CommandBase command){
try {
commandOutputStream.writeUnshared(command);
commandOutputStream.flush();
System.out.println("Sent " + command.getAction().toString());
} catch (IOException e) {
System.out.println("Failed to send " + command.getAction().toString());
try {
commandOutputStream.close();
running = false;
this.dispose();
System.out.println("Closing command output stream");
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
接收
while(going && tcpSender.running){
//Get action from stream
try {
System.out.println("Available bytes: " + commandInputStream.available());
Object command = ((CommandBase) commandInputStream.readObject());
System.out.println("Action received");
if (command instanceof CommandBase) {
if(((CommandBase)command).getAction().equals(ActionType.MouseAction)){
System.out.println("Mouse action");
//JOptionPane.showMessageDialog(null, "Received Mouse Action");
((MouseCommand)command).doAction(operator);
}else if(((CommandBase)command).getAction().equals(ActionType.KeyboardAction)){
System.out.println("Keyboard action");
//JOptionPane.showMessageDialog(null, "Received Keyboard Action: " + ((KeyboardCommand)command).toString());
((KeyboardCommand)command).doAction(operator);
}else if(((CommandBase)command).getAction().equals(ActionType.CheckBooleanAction)){
System.out.println("Check boolean action");
udpSender.notifyThis((CheckBooleanCommand)command);
}else{
//JOptionPane.showMessageDialog(null, "Received unknown command " + ((CommandBase)command).getAction().toString());
System.out.println("Action type is: " + ((CommandBase)command).getAction().toString());
}
}
} catch (EOFException e) {
System.out.println("EOF-Exception - end of stream reached");
e.printStackTrace();
continue;
} catch(IOException e){
System.out.println("IO-Exception - Unable to read action \n Closing socket");
try {
commandInputStream.close();
System.out.println("Closed command input stream");
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
going = false;
tcpSender.running = false;
} catch (ClassNotFoundException e) {
System.out.println("Class not found - failed to cast to Action");
e.printStackTrace();
}
}
TL;DR:ObjectInputStream
如何确定它是流的结尾,是什么原因造成的?
我该如何解决这个问题?
错误信息:
`
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)
How does the ObjectInputStream
decide that it's the end of a stream
当 ObjectInputStream
尝试从底层流中读取时会发生这种情况,并且该流 returns -1
... 这意味着已经到达流的结尾。
and what causes it?
在这种情况下,最可能的解释是远程端(发送方)关闭了它的套接字,或者它已经崩溃......这将导致套接字关闭。
(理论上是有可能断线的,但这种情况只有在比较隐蔽的情况下才会发生,所以忽略掉吧。)
And how can I solve this problem?
你需要明白为什么发送端关闭了socket。不幸的是,我们无法说明原因,因为您提供的代码不是 MCVE。
根据我的理解,end of stream
的全部意义在于告诉输入流何时停止读取数据,这在文件流中是有意义的,但是当它是一个 ObjectInputStream
为什么我要如果我将来可能会发送另一个对象,它会停止读取对象。
在我的例子中,ObjectInputStream
每当它决定有什么东西导致流结束时抛出一个 EOFException
。
代码段:
发送中:
public synchronized void sendCommand(CommandBase command){
try {
commandOutputStream.writeUnshared(command);
commandOutputStream.flush();
System.out.println("Sent " + command.getAction().toString());
} catch (IOException e) {
System.out.println("Failed to send " + command.getAction().toString());
try {
commandOutputStream.close();
running = false;
this.dispose();
System.out.println("Closing command output stream");
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
接收
while(going && tcpSender.running){
//Get action from stream
try {
System.out.println("Available bytes: " + commandInputStream.available());
Object command = ((CommandBase) commandInputStream.readObject());
System.out.println("Action received");
if (command instanceof CommandBase) {
if(((CommandBase)command).getAction().equals(ActionType.MouseAction)){
System.out.println("Mouse action");
//JOptionPane.showMessageDialog(null, "Received Mouse Action");
((MouseCommand)command).doAction(operator);
}else if(((CommandBase)command).getAction().equals(ActionType.KeyboardAction)){
System.out.println("Keyboard action");
//JOptionPane.showMessageDialog(null, "Received Keyboard Action: " + ((KeyboardCommand)command).toString());
((KeyboardCommand)command).doAction(operator);
}else if(((CommandBase)command).getAction().equals(ActionType.CheckBooleanAction)){
System.out.println("Check boolean action");
udpSender.notifyThis((CheckBooleanCommand)command);
}else{
//JOptionPane.showMessageDialog(null, "Received unknown command " + ((CommandBase)command).getAction().toString());
System.out.println("Action type is: " + ((CommandBase)command).getAction().toString());
}
}
} catch (EOFException e) {
System.out.println("EOF-Exception - end of stream reached");
e.printStackTrace();
continue;
} catch(IOException e){
System.out.println("IO-Exception - Unable to read action \n Closing socket");
try {
commandInputStream.close();
System.out.println("Closed command input stream");
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
going = false;
tcpSender.running = false;
} catch (ClassNotFoundException e) {
System.out.println("Class not found - failed to cast to Action");
e.printStackTrace();
}
}
TL;DR:ObjectInputStream
如何确定它是流的结尾,是什么原因造成的?
我该如何解决这个问题?
错误信息:
`
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)
How does the
ObjectInputStream
decide that it's the end of a stream
当 ObjectInputStream
尝试从底层流中读取时会发生这种情况,并且该流 returns -1
... 这意味着已经到达流的结尾。
and what causes it?
在这种情况下,最可能的解释是远程端(发送方)关闭了它的套接字,或者它已经崩溃......这将导致套接字关闭。
(理论上是有可能断线的,但这种情况只有在比较隐蔽的情况下才会发生,所以忽略掉吧。)
And how can I solve this problem?
你需要明白为什么发送端关闭了socket。不幸的是,我们无法说明原因,因为您提供的代码不是 MCVE。