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

时间:2013-06-08 09:37:29

标签: java sockets network-programming

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

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

问题是,在建立连接后,程序会卡住它们,没有错误,没有异常;停止

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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