1

Java ソケット プログラミングについて 2 つの質問があります。これはスタンドアロン アプリケーションであり、J2SE でのみビルドされます。

1)私の場合、同じポートを介して同時に読み取り/書き込みを行うことは可能ですか?これはhttpsリクエストになるため、ポートは443になります.

2) 1 つの Java アプリケーションで 2 つのソケット接続を作成することは可能ですか。そのうちの 1 つのソケットはクライアントとして機能し、他はサーバーとして機能します。

これに関するいくつかの資料を探していましたが、役立つものが見つかりませんでした。

4

4 に答える 4

4

ソケット接続は双方向であるため、1 つの接続で読み取りと書き込みを行うことができます。ソケットにワイヤプラグを接続するのと似ているため、ソケットという名前が付けられています。

やり方はこちら

Socket socket = new Socket("10.0.0.1", 1234);
OutputStream os = socket.getOutputStream();
InputStream is socket.getInputStream();
new MyInputServiceThread(is).start();

これで、OS から書き込み、OS から読み取ることができます。同期しないことが予想される場合は、同じスレッドまたは異なるスレッドで実行できます。

2 では、1 つのアプリに任意の数のクライアントとサーバー ソケットを含めることができます。少なくとも理論的には。実用上の制限があります。サーバーソケットの場合、接続を受け入れてから、開いているソケットを渡すスレッドを生成すると、サーバーソケットはより多くの接続を受け入れる準備ができているはずです。つまり、同じポートで複数の接続を許可するには、接続を受け入れた後にブロックしないようにする必要があります。ただし、複数のスレッドで複数のサーバー ソケットを開くこともできます。

ここに例があります

ServerSocket server = new ServerSocket(1234);
while (true) {
    Socket socket = server.accept();
    // Once it spawns the thread that socket connection is serviced by 
    //the thread and the        
    //server socket is ready to accept new connections.
    new Mythread(socket).start();
    // above Mythread extends Thread....    
}

クライアントとしてのアプリの場合、制限はありません。つまり、接続したい数だけ。

別の注意事項... httpsの場合、証明書も受け入れる必要があります。つまり、秘密の公開鍵を処理する必要があります。あなたは本当にそれをしたいですか?Tomcat やその他のアプリ サーバーは既にそれを行っているためです。これが Web アプリになる場合は、適切に署名されたデジタル証明書についても考慮する必要があります。イントラネットの場合、ブラウザがアクセスに使用していた場合、自己生成の自己署名証明書をインポートする必要があります。

于 2011-12-21T00:48:46.570 に答える
2

あなたの両方の質問に対する答えはイエスです。2 番目の質問では、サーバー上のアクティビティをリッスンするスレッドを作成する必要があります。

そして、このチュートリアルを見てください

于 2011-12-21T00:42:50.550 に答える
0
  1. ポートを作成しているプログラムはサーバー プログラムです。

  2. サーバー プログラムでは、クライアントの要求をリッスンする複数のポートを作成できます。

  3. クライアントはポートを作成しませんが、サーバー プログラムのみが作成します。クライアントは、そのサーバー ポートでのみサーバーに要求を送信します。したがって、プログラム内の任意の数のポートは常にサーバー ポートです。

  4. クライアントがサーバーにリクエストを送信すると、サーバーはリクエストが配置されたバッファメモリを取得し、サーバーはそれを読み取ります。サーバーは、サーバーがクライアントに返信するために必要な応答を書き込むことができる別のバッファ メモリも取得します。したがって、はい、サーバーは同時に読み取りと書き込みを行うことができます。

于 2015-05-14T10:59:29.687 に答える