首先,我相当新,所以我不确定要放在哪里的代码,因为我认为问题可能出在很多不同的地方。无论如何,我正在制作一个即时通讯程序,我正在发送图像。首先,我将图像转换为字节数组然后将它们发送到服务器,然后将它们路由到客户端。在服务器端,我有一些线程监听任何类型的对象。这是他们的run()
方法:
@Override
public void run(){
while(isAlive()){
try{
received = input.readObject();
}catch(IOException | ClassNotFoundException exception){
exception.printStackTrace();
}
}
}
input
是ObjectInputStream
,我有一个获取received
对象的getter。但是,只有在发送此字节数组时,我才会在SocketException
行上获得received = input.readObject()
。这是堆栈跟踪:
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at java.net.SocketInputStream.read(SocketInputStream.java:203)
at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2296)
at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2589)
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2599)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1319)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at server.ReaderThread.run(ReaderThread.java:24)
所以你知道发生了什么吗?作为参考,在我的服务器类中,我通过getter将另一个对象分配给received
的值,然后使用{{检查它是String
,byte[]
等。 1}}(如果那是相关的)。当即时通讯工具只是在客户端和服务器之间时,这种方法的相当类似的版本工作得更早。我知道我遗漏了很多代码;只是问,我会编辑或评论。
以下是实际服务器程序中分配新对象的代码(请记住instanceof
和receiveds
为lastReceiveds
,这是在ArrayList
中运行的环):
for(int i = 0)
然后我继续对lastReceiveds.set(i, receiveds.get(i));
receiveds.set(i, readerThreads.get(i).getReceived());
的元素执行.equals
并继续处理数据。
[编辑] 所以我被告知我正在关闭我的套接字,流等,这是真的。以下是导致此问题的代码(正在调用的receiveds
方法,只关闭我的所有套接字,流等):
close()
对不起,这一切都是如此缩进。每当收到一个字节数组时,它就会输出 try{
waitForConnection();
setupStreams();
System.out.println("Got to here");
whileChatting();
}catch(EOFException eofException){
showMessage("\nERROR! CONNECTION REFUSED");
eofException.printStackTrace();
}finally{
close();
}
close()`。
答案 0 :(得分:0)
此异常意味着您关闭了此代码中某处的套接字,然后继续使用它。它与同伴或其发送的内容无关。
你还需要单独捕捉EOFException
,并在没有记录的情况下突破循环。除IOException
之外的任何其他SocketTimeoutException
对连接也是致命的,并且应该导致中断。