Java套接字,是死锁还是什么?

我有一个客户端服务器程序在服务器端使用套接字,并以这种方式进行读写

soc = serversocket.accept(); System.out.println("Accepted"); in = new ObjectInputStream(soc.getInputStream()); out = new ObjectOutputStream(soc.getOutputStream()); if(in.readUTF() == null ? " " != null : !in.readUTF().equals(" ")) { diskinfo.setPath(in.readUTF()); } Item[] pac = diskinfo.get(); out.writeObject(pac); 

同样在cilent(android)方面……

 Log.v("read", "item"); soc = new Socket(InetAddress.getByName("10.0.2.2"), 3838); output = new ObjectOutputStream(soc.getOutputStream()); input = new ObjectInputStream(soc.getInputStream()); try { output.writeUTF(path); packets = (Item[]) input.readObject(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

问题是,在建立连接后,程序卡住了它们,没有错误,没有exception; 停下来

它是一个死锁,你必须先创建并刷新ObjectOutputStream。 这是因为ObjectInputStream在继续之前读取OOS发送的头。

这不是一个僵局,只是糟糕的代码。 你继续调用readUTF()然后再抛出结果并再次调用它,就好像你调用它一样多次发送它,它不是。 所以你在对readUTF()的冗余调用中阻塞

所以不要这样做。 调用一次并将结果存储在变量中。

它永远不会返回null。 检查Javadoc。