2

ServerSocketすべてのクライアントへの接続を開くことになっているサーバーがあります。問題は、クライアントが ConnectionPort が既に使用されているかどうかを確認する必要があることです。つまり、クライアントはポート 12345 をチェックし、ServerSocket「待機」があるかどうか結果を取得し、そうでない場合は次のポートを取得する必要があります。

したがって、最終的に 2 つまたは 3 つのクライアントがポート 12345、12346、12347 でサーバーに接続されます...

私はこれを書きました:

serverSocket = new ServerSocket(incomingPort, 1); // backlog 1 = Minimum
incomingSocket = serverSocket.accept();
readerIn = new BufferedReader(new InputStreamReader(incomingSocket.getInputStream()));

outgoingSocket = new Socket(incomingSocket.getInetAddress().getHostAddress(), outgoingPort);
dataOutputStream = new BufferedOutputStream(outgoingSocket.getOutputStream());
pwOut = new OutputStreamWriter(outgoingSocket.getOutputStream());

最初のクライアントを接続し、(最後の 3 行で) クライアントに「戻る」別の接続を開きます。クライアント側では、ほぼ同じことを書きましたが、その逆です。

outgoingSocket = new Socket(serverIP, inPort1);
dataOutputStream = new BufferedOutputStream(outgoingSocket.getOutputStream());
pwOut = new OutputStreamWriter(outgoingSocket.getOutputStream());

serverSocket = new ServerSocket(outPort1);
incomingSocket = serverSocket.accept();
readerIn = new BufferedReader(new InputStreamReader(incomingSocket.getInputStream()));

接続を開こうとする次のクライアントは、同じポートから開始して同じことを行います。私はそのExceptionようなものを手に入れたいと思っていましConnectExceptionたが、何もありませんでした。バックログの「バッファ」に関係していると思います。それはすべてを継続し、なるのをServerSocket待ちますが、永遠に待ちます。サーバー自体は、最初の接続で既に占有されています。

私は多くの投稿を読みましたが、少なくともタイムアウトまで、それはoutgoingSocket.isConnected()与えtrueていると言っています。サーバーがすでに占有されていることを確認する方法はありますか? または、少なくともバックログを「無効」にして、すべての着信接続が拒否されるようにしますか?.isClosed()false

4

3 に答える 3

4

1あなたの直接の質問に答えてください - いいえ、TCP ソケット バックログ キューのリッスンを無効にすることはできませんaccept()。そこでできることはclose()、最初のクライアント接続を受け入れた後のサーバー ソケットです。

次に、実際のもの - なぜこのような 2 つのソケットが必要だと思いますか? 単一の TCP 接続は全二重です。つまり、双方向で通信できます。

于 2012-08-09T21:03:08.813 に答える
3

クライアント/サーバー通信とソケットインターフェースの概念を理解しているかどうかはわかりません。サーバー間で通信するために新しいソケットを作成する必要はありません。TCP接続は双方向であり、読み取り元と同じソケットに書き込むことができます。

クライアントサーバーの優れたについては、公式ドキュメントを参照するか、完全なチュートリアルに従ってください。

サーバーが単一の接続のみを受け入れるアプローチを続行する場合は、接続を受け入れた後にサーバーを閉じる必要がありserverSocketます。incomingSocketクラスを使用したコミュニケーションは引き続き可能です。

于 2012-08-09T21:04:52.237 に答える
1

すべてのクライアントに対して SocketServer 接続を開くことになっているサーバーがあります。

いいえ、ありません。「SocketServer 接続」のようなものはなく、TCP サーバーが接続を作成し、クライアントからの接続ServerSocket受け入れます。接続を開くのはクライアントです。

問題は、クライアントが ConnectionPort が既に使用されているかどうかを確認する必要があることです。

いいえ、ありません。すべてのクライアントが同じポート番号に接続します。クライアントは何もチェックする必要はありません。

つまり、クライアントはポート 12345 をチェックし、「待機中」の ServerSocket があるかどうか結果を取得する必要があります。そうでない場合、彼らは次のなどを取ります

いいえ、そうではありません。クライアントはリスニング ポートに接続するだけです。限目。あなたはプロセス全体を完全に誤解しています。

いくつかのコードを読み、サンプル コードを確認してから、最初からやり直すことをお勧めします。

于 2012-08-09T22:22:47.557 に答える