2011-10-01 67 views
6

我感觉真的很愚蠢现在家伙....基本上我通过在本地机器上的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(); 
     } 
+0

服务器是否发送该对象?这似乎是服务器不发送任何东西。 – MasterCassim

+0

'ObjectInputStream'可能等待接收到流标头。 – NiematojakTomasz

+0

我没有按照...服务器接受TCP连接。我想读你会去ois.readObject()? 我已经设置好客户端发送第一个对象......我只是想创建流。 – Michael

回答

6

从ObjectInputStream中的specification

此构造方法将阻塞,直到相应的ObjectOutputStream 写和冲洗头。

1

(对于将来的读者:)我有同样的问题,因为我在服务器程序中做了一个愚蠢的改变,并没有测试很长一段时间,然后我很困惑为什么程序被锁定。

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

相关问题