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 に答える