5

クライアントからの接続を受け入れ、その接続されたソケットを別のオブジェクトに渡しますが、そのソケットは非ブロックである必要があります。使用しようとしていますgetChannel().configureBlocking(false)が、機能していないようです。以下のメソッドは 100 ミリ秒ごとに呼び出されるため、ノンブロッキングである必要があります。このノンブロッキングにする必要がある他の方法はありますか? 助けてくれてありがとう!

public void checkForClients() {
  DataOutputStream out;
  DataInputStream in;
  Socket connection;
  InetAddress tempIP;
  String IP;

  try {
     connection = serverSocket.accept();
     connection.getChannel().configureBlocking(false);

     System.err.println("after connection made");

     in = new DataInputStream(connection.getInputStream());
     out = new DataOutputStream(connection.getOutputStream());
     tempIP = connection.getInetAddress();
     IP = tempIP.toString();

     System.err.println("after ip string");

     // create a new user ex nihilo
     connectedUsers.add(new ConnectedUser(IP, null, connection, in, out));


     System.err.println("after add user");
  } catch (SocketTimeoutException e) {
     System.err.println("accept timeout - continuing execution");
  } catch (IOException e) {
     System.err.println("socket accept failed");
  }
}
4

5 に答える 5

10

2つのこと:

  1. 接続をリッスンしているのに、なぜ a を使用しないのですServerSocketか?
  2. 複数のクライアントを受け入れたい場合は、ループを使用します。

マルチクライアント サーバーの基本構造は次のとおりです。

while (true) {
  // accept connections
  // spawn thread to deal with that connection
}

問題がaccept()通話をブロックしている場合は、それが原因accept()です。接続を待機することをブロックします。それが問題である場合は、接続を受け入れるための別のスレッドを用意することをお勧めします。

ソケットのサーバー側の書き込みを参照してください。

于 2009-11-09T01:39:29.767 に答える
1

コードが accept 呼び出しでブロックされ、configureBlocking 呼び出しに到達しないことが期待されます。

私は通常、ソケット接続ごとに個別のスレッドをスピンオフし、接続が実際に作成/受け入れられるまでブロックします。これにより、クライアント接続を待機している間、メインスレッドはブロックされずに続行できます。

于 2009-11-09T01:34:45.603 に答える
1

ノンブロッキング ソケットをお探しの場合は、NIO パッケージでセレクターと ServerSocketChannels を使用することをお勧めします。

http://java.sun.com/j2se/1.4.2/docs/guide/nio/

于 2009-11-09T02:30:58.553 に答える
0

通常のブロッキングソケットで必要な可用性が得られない場合(100ミリ秒ごとの接続は緊密に見えます)。ノンブロッキングソケットを確認する必要があります。これがチュートリアルです。これを簡単にするために、ApacheMINAを確認することもできます。

于 2009-11-09T02:16:47.080 に答える
0

1 つのアプローチは、シングル スレッド環境で I/O ループ (イベント ループ) を使用することです。インスピレーションについては、 Deft Web サーバーをご覧ください。(特にIOLoopの start() メソッド)

于 2010-10-04T15:49:17.753 に答える