Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java套接字,这是死锁还是什么?_Java_Sockets_Network Programming - Fatal编程技术网

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

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

我有一个在服务器端使用socket的客户机-服务器程序,读写就是这样进行的

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