Java套接字,这是死锁还是什么?
我有一个在服务器端使用socket的客户机-服务器程序,读写就是这样进行的Java套接字,这是死锁还是什么?,java,sockets,network-programming,Java,Sockets,Network Programming,我有一个在服务器端使用socket的客户机-服务器程序,读写就是这样进行的 soc = serversocket.accept(); System.out.println("Accepted"); in = new ObjectInputStream(soc.getInputStream()); out = new ObjectOutputStream(soc.getOutputStream()); if(in.readUTF() == null ? " " != null : !in.re
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)方面
问题是,连接建立后,程序卡住了,没有错误,也没有异常;只需停止这是一个死锁,您必须首先创建并刷新ObjectOutputStream。这是因为ObjectInputStream在继续之前读取OOS发送的头。这不是死锁,只是错误代码。您不断调用readUTF(),然后丢弃结果并再次调用它,就好像同一个东西被发送的次数与您调用它的次数一样,而事实并非如此。因此,在对readUTF()的冗余调用中,您正在阻塞 所以不要那样做。调用它一次并将结果存储在变量中
它永远不会返回null。检查Javadoc。这个if块确实很难理解。你自己明白吗?你知道它从输入流中读取了多少次吗?是的,我现在已经更改了。我只调用了一次.readObject(),并将返回字符串保存在一个变量中。只有当两端都首先创建ObjectInputStream时,才会发生你所指的死锁,这在这里没有发生。@EJP我怀疑这是另一个问题的正确答案。;)@EJP我应用了你和Peter建议我的更改,但当我应用了你建议我的代码时,代码仍然不工作,但当我刷新输出流时,代码仍在工作,即使我撤销了你告诉我的更改,无论如何,这不是出于你对该线程的考虑和兴趣
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();
}