4

我有一个在服务器端使用套接字的客户端-服务器程序,读写是以这种方式发生的

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();
}

问题是,建立连接后程序卡住了,不报错也不例外;停下来

4

2 回答 2

2

这不是死锁,只是糟糕的代码。您继续调用 readUTF() ,然后将结果扔掉并再次调用它,就好像同一件事被发送的次数与您调用它的次数一样多,但事实并非如此。因此,您在对 readUTF() 的冗余调用中处于阻塞状态。

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

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

于 2013-06-08T10:00:45.043 回答
1

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

于 2013-06-08T09:38:55.953 回答