Java Socket中使用ObjectInputStream发生死锁


Socket编程中一个很奇怪的现象:用DataInputStream对象没错,但改为ObjectInputStream就出错了,而且try…catch还抓不到异常。


例如在Socket客户端中,使用DataInputStream进行下述编程,很正常,不会出现问题:

 DataInputStream dis = new DataInputStream(socket.getInputStream);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream); 

   

但若改用ObjectInputStream对象进行编程,如下:

 ObjectInputStream ois = new ObjectInputStream(socket.getInputStream); 
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream); 

   

这时程序就死锁住了,不报错或异常出来,用try…catch也抓不到异常信息。

解决方案:将dis于dis的顺序换一下,即dos在dus之前,这样程序又恢复正常了,不会出现死锁卡住的现象。如下:

 ObjectOutputStream dos = new ObjectOutputStream(socket.getOutputStream); 
ObjectInputStream dis = new ObjectInputStream(socket.getInputStream); 

   

这样一来,就是先创建输出流对象,再创建输入流对象。同样在服务器端改为先创建输入流对象,再创建输出流对象,一个完整的Socket通信才不会出错。

    原文作者:java锁
    原文地址: https://blog.csdn.net/wenhuadream/article/details/45226729
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞