我有一个客户端服务器程序在服务器端使用套接字,读写正在以这种方式发生
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();
}
问题是,在建立连接后,程序会卡住它们,没有错误,没有异常;停止
答案 0 :(得分:2)
这不是一个僵局,只是糟糕的代码。你继续调用readUTF()然后再将结果抛出并再次调用它,就好像你调用它一样多次发送它,而事实并非如此。所以你在对readUTF()的冗余调用中阻塞,。
所以不要这样做。调用一次并将结果存储在变量中。
它永远不会返回null。检查Javadoc。
答案 1 :(得分:0)
它是一个死锁,你必须先创建并刷新ObjectOutputStream。这是因为ObjectInputStream在继续之前读取OOS发送的头。