Java创build一个新的ObjectInputStream块

我试图创build一个新的ObjectInputStream使用从Socket检索的InputStream。 这是我的代码:

这是我的MessageGetterSender类的构造函数。 程序没有到达检查点4。

public MessageGetterSender(Socket socket) { System.out.println("MessageGetterSender: Checkpoint 1"); this.socket = socket; // Get input and output streams try { System.out.println("MessageGetterSender: Checkpoint 2"); InputStream is = socket.getInputStream(); System.out.println("MessageGetterSender: Checkpoint 3"); this.in = new ObjectInputStream(is); System.out.println("MessageGetterSender: Checkpoint 4"); } catch (IOException ioe) { System.out.println("Could not get ObjectInputStream on socket: " + socket.getLocalPort()); } try { this.out = new ObjectOutputStream(socket.getOutputStream()); } catch (IOException ioe) { System.out.println("Could not get ObjectOutputStream on socket: " + socket.getLocalPort()); } System.out.println("MessageGetterSender: Checkpoint 5"); } 

我从一个类中实例化一个新的MessageGetterSender对象,在该类中连接到服务器以获取套接字。 这是相关的代码。 它是InstantMessageClass的构造函数,即实例化MessageGetterSender对象的类:

 public InstantMessageClient(String username) { try { socket = new Socket("localhost", 5555); } catch (IOException ioe) { System.out.println("Error: Could not connect to socket on port: " + serverPort); } messageGetterSender = new MessageGetterSender(socket); ... 

由于代码不执行到检查点4,但它确实进入检查点3,我很确定ObjectInputStream的实例化是罪魁祸首。 我不明白为什么。 有任何想法吗? 谢谢您的帮助。

在构造ObjectInputStream ,在构造函数中,类会尝试读取连接另一端写入的关联ObjectOutputStream的头。 它不会返回,直到读取头。 所以,如果你看到构造函数“挂起”,这是因为套接字的另一端或者没有使用ObjectOutputStream ,或者没有刷新数据。

为了扩大FatGuy对其他Google员工的回答, 解决这个“鸡与鸡蛋问题”的办法是让每一边先打开输出stream,刷新输出stream,然后打开inputstream。

 ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); out.flush(); ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); 

您也可以延迟ObjectInputStream的初始化,直到数据在基础stream中可用。

不pipestream的初始化顺序如何,这种方法都可以工作,如果通道的一端是不能更改的库代码,则该方法特别有用。