Java的ObjectInputStream挂
问题描述:
我感觉真的很愚蠢现在家伙....基本上我通过在本地机器上的TCP连接...当我尝试在客户端进出流,它不会通过创建对象输入流。是什么赋予了?打印后停止2 ...没有例外或任何东西......这不是我第一次使用这个类,这很偏僻,为什么我感到困惑。Java的ObjectInputStream挂
try {
System.out.println("1");
mySocket = new Socket("localhost", 11311);
System.out.println("12");
oos = new ObjectOutputStream(mySocket.getOutputStream());
System.out.println("2");
ois = new ObjectInputStream(mySocket.getInputStream());
System.out.println("13");
} catch (Exception e) {
e.printStackTrace();
}
答
(对于将来的读者:)我有同样的问题,因为我在服务器程序中做了一个愚蠢的改变,并没有测试很长一段时间,然后我很困惑为什么程序被锁定。
ServerSocket
接受一个inapropriate if
连接(responderSocket = serverSock.accept();
)然后突然(傻我提到的变化!)程序跳出线程和因为我没有加入finally
块关闭流和插座留插座遗弃没有发送或接收任何东西(甚至是流头)。因此,在客户端程序没有流标头(当我debbugged我看到锁之前执行的最后一个功能是代码:
public ObjectInputStream(InputStream in) throws IOException {
verifySubclass();
bin = new BlockDataInputStream(in);
handles = new HandleTable(10);
vlist = new ValidationList();
enableOverride = false;
readStreamHeader(); //// <== This function
bin.setBlockDataMode(true);
}
readStreamHeader();
)
所以,要小心在服务器端会发生什么,也许问题不在你期待的地方!
+3
您不应该首先在accept()循环中构造对象流。你应该在连接处理线程的run()方法中构造它们。否则,您可能会冒着阻塞流首部的I/O上的accept()循环的风险,这将阻止其他客户端。 – EJP
服务器是否发送该对象?这似乎是服务器不发送任何东西。 – MasterCassim
'ObjectInputStream'可能等待接收到流标头。 – NiematojakTomasz
我没有按照...服务器接受TCP连接。我想读你会去ois.readObject()? 我已经设置好客户端发送第一个对象......我只是想创建流。 – Michael