2

私の質問が正しいかどうかわかりません...@@

(完全なソースコード: https://github.com/oNaiPs/droid-VNC-server )

Windows XP、Eclipse AVD(API レベル 14) で上記リンクのソース コードを実行したところ、サーバーを起動するステップで失敗しました。

デバッグ モードでコードをトレースしているときに、このコードで例外が発生しました

public static boolean isServerRunning() {
    try {
        byte[] receiveData = new byte[1024];
        DatagramSocket clientSocket = new DatagramSocket();
        InetAddress addr = InetAddress.getLocalHost();

        clientSocket.setSoTimeout(100);
        String toSend = "~PING|";
        byte[] buffer = toSend.getBytes();

        DatagramPacket question = new DatagramPacket(buffer, buffer.length,
                addr, 13132);
        clientSocket.send(question);

        DatagramPacket receivePacket = new DatagramPacket(receiveData,
                receiveData.length);
        clientSocket.receive(receivePacket);
        String receivedString = new String(receivePacket.getData());
        receivedString = receivedString.substring(0, receivePacket
                .getLength());

        return receivedString.equals("~PONG|");
    } catch (Exception e) {
        return false;
    }
}

この行まで実行すると「clientSocket.receive(receivePacket);」

「キャッチ(例外e)」に行きます

変数 e の内容は

e:                       SocketTimeOutException (id=830027971416)
   bytes Transferred      0
  +cause                  ErrorException (id=830029535888)
   detailMessage          null
  +stackState             (id=830027970928)
   stackTrace             null
  +suppressedExceptions   ArrayList(id=830027971456)

サーバーが時間通りに応答しなかったことによる例外の原因であることがわかりました。 (Class Stacker に感謝します)。したがって、この行「clientSocket.setSoTimeout(100);」にコメントを付けます。長い間待って、まだスタックしていることを確認してください。

AVD を実行するときにデバイスを接続する必要があるのか​​ 、それとも AVD でのみ実行できるのかはわかりません。

変数「clientSocket」を見ると、この行「clientSocket.send(question);」の後に、サブコンテンツの「アドレス」が null になり、「ポート」が -1 になりました。これは正しい結果ですか?(AndroidパッケージのWebサイトでクラスの説明を読みましたが、理解できません。http://developer.android.com/reference/java/net/DatagramSocket.html

4

1 に答える 1

0

説明したように、このテスト用に別のスレッドを作成するわけではありません。この「偽のクライアント」コードは、PING 要求を処理し、PONG 応答を提供する必要がある同じスレッド内のサーバー アプリで実行されます。

簡単な解決策の 1 つは、このコードを 内にラップしてRunnable、別の を開始するThreadことです。クイックスタートの例は次のようになります (今のところ結果を破棄し、

# start your concurrent request on-the-fly
Thread serverTest = new Thread(new Runnable() { public void run() { isServerRunning(); }});
serverTest.start();

ただし、Androidではなく、同時実行synchronized、、およびvolatileと の使用に関する詳細を調べてください。HandlerThreadAsyncTaskThread

于 2013-01-25T09:22:52.420 に答える