【发布时间】:2016-03-22 20:44:12
【问题描述】:
首先,我还很新,所以我不确定要放什么代码,因为我认为问题可能出在很多不同的地方。无论如何,我正在制作即时通讯程序并发送图像。首先,我将图像转换为字节数组,然后将它们发送到服务器,然后将它们路由到客户端。在服务器端,我有一些线程监听任何类型的对象。这是他们的run() 方法:
@Override
public void run(){
while(isAlive()){
try{
received = input.readObject();
}catch(IOException | ClassNotFoundException exception){
exception.printStackTrace();
}
}
}
input 是ObjectInputStream,我有一个getter 来获取received 对象。但是,只有当我发送这个字节数组时,我才会在received = input.readObject() 行上得到一个SocketException。这是堆栈跟踪:
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 的值,然后使用 instanceof 检查它是否是 String、byte[] 等(如果在所有相关的)。当即时通讯器只是在客户端和服务器之间时,这种方法的相当相似的版本工作得更早。我知道我遗漏了很多代码;只要问,我会编辑或评论。
这是分配新对象的实际服务器程序中的代码(记住receiveds 和lastReceiveds 是ArrayLists,这是在for(int i = 0) 循环中运行的):
lastReceiveds.set(i, receiveds.get(i));
receiveds.set(i, readerThreads.get(i).getReceived());
然后我继续对receiveds 的那个元素执行.equals 并继续处理数据。
[编辑] 所以有人告诉我我正在关闭我的套接字、流等,这是真的。这是导致这种情况的代码(正在调用的close() 方法只是关闭了我所有的套接字、流等):
try{
waitForConnection();
setupStreams();
System.out.println("Got to here");
whileChatting();
}catch(EOFException eofException){
showMessage("\nERROR! CONNECTION REFUSED");
eofException.printStackTrace();
}finally{
close();
}
对不起,这一切都缩进了。每当它接收到一个字节数组时,它就会输出"Got to here", then runsclose()`。
【问题讨论】:
-
你能发布更多代码吗?
-
EOFExceptionnot 表示“连接被拒绝”。这意味着对等方关闭了连接,这也意味着有一个连接,这也意味着它没有被拒绝。 `ConnectException:连接被拒绝'意味着'连接被拒绝'。不要编造自己的错误信息。使用异常中的那个,或者异常本身。 -
谢谢。我将其更改为仅打印堆栈跟踪并说
ERROR! END OF FILE -
好吧,可能是因为我处理字节数组的方式导致了
IOException -
这也不是错误。对等方预计会在一段时间内断开连接。
标签: java sockets stream socketexception instant-messaging