4

単体テストを実装するには、単純なクライアント サーバー通信が必要です。

私の手順:

  1. サーバー スレッドの作成
  2. サーバースレッドがサーバーソケットをリッスンモードにするのを待ちます ( serverSocket.accept() )
  3. クライアントの作成
  4. いくつかのリクエストを行い、レスポンスを確認します

基本的に、ステップ 2 に問題があります。サーバーソケットが「リッスン」状態になったときに通知する方法が見つかりません。この場合、「accept」への非同期呼び出しが行われますが、Java はこれをサポートしていません (非同期チャネルのみをサポートしているようで、ドキュメントによると「accept()」メソッドと互換性がありません)。

もちろん、単純な「スリープ」を入れることはできますが、それは本番コードの実際の解決策ではありません。

要約すると、スリープやポーリングを使用せずに ServerSocket がリッスン モードになったことを検出する必要があります。

4

2 に答える 2

7

ServerSocketソケットは、 を呼び出したときではなく、オブジェクトを構築するとすぐにリッスン状態になりますaccept。コンストラクターの完了後にクライアントを作成する限りServerSocket、問題はありません。接続は受け入れられ、呼び出されるまで内部的にキューに入れられacceptます。

デモ用のコードを次に示します。

ServerSocket serverSocket = new ServerSocket(12345);
Thread.sleep(10000);
Socket socket = serverSocket.accept();

が呼び出される前の 10 秒のギャップの間accept、OS の netstat コマンドはサーバー ソケットを「LISTENING」状態で表示し、クライアントはそれに接続できます。その 10 秒間にクライアントが接続すると、接続はキューに入れられ、acceptメソッドが最後に呼び出されると、すぐにキューに入れられたSocketオブジェクトが返されます。

于 2010-12-29T11:21:38.337 に答える
-1

accept() を呼び出す直前に single を送信しないのはなぜですか?

connectionAccepted = true;
loc.notify();
socket.accept();

ソケットの準備ができていることを確認するには、「クライアント」コードに小さなスリープを追加します。

wait();
// we are here when notify is called.
Thread.sleep(10); // 10 ms
startTest();

あなたはもっとうまくやることができます:試行の間に小さなスリープでソケットを「ping」しようとするループを作成します。この場合、できるだけ早くテストを開始します。

于 2010-12-29T10:50:39.247 に答える