「こんにちは、アミーゴ!」

「こんにちは、リシ!」

「今日のレッスンのテーマはソケットです。」

「ネットワーク上のすべてのコンピュータには独自の一意の IP アドレスがあることはすでにご存知でしょう。」

「はい。」

「次に、複数のコンピュータがあり、それぞれがインターネットにアクセスする十数のプログラム (Skype、ICQ など) を実行していると想像してください。」

「そして、これらのプログラムは相互に通信したいと考えています。」

「それらが相互に干渉するのを防ぐ必要があります。Skype は Skype に接続し、Slack は Slack に接続するようにする必要があります。」

「この問題が URL と Web サーバーを使用してどのように解決されたか覚えていますか?」

「はい、ポートを追加しました。」

"その通り。"

「家の中に小さな部屋をたくさん作って、その家を集合住宅だと言うのと同じです。各ポートは独立した集合住宅のようなものです。

「IP アドレスがコンピュータの一意の識別子である場合、IP アドレスとポートを組み合わせたものは、プログラムが常駐できるコンピュータ内の特定の「アパートメント」の一意の識別子になります。

「この固有の場所はソケットと呼ばれます。」

"ソケットには、IP アドレスとポート番号で構成される独自の固有の番号があります。 "

「ああ。言い換えれば、ソケットは、プログラムが常駐できる仮想コンピュータの場所の識別子ですか? そして、別のプログラムがこの場所にメッセージを送信し、それによって 2 つのプログラムが通信できるようになります?」

「どうやってそれを理解したのか分かりませんが、まさにその通りです。」

「ロボセンスが教えてくれた。」

「わかりました。それでは、詳しく説明させていただきます。」

「ソケットは実際、プログラムが通信するための最も基本的かつ原始的な方法です。」

「Java にはソケットを操作するための 2 つのクラスがあります。それらはSocketServerSocketです。」

" ServerSocket は、そのオブジェクトがサーバーを表す特別なクラスです。つまり、特定のソケットに到着するリクエストを処理できるようになります。"

Socketクラスは実際にはクライアント ソケットです。これを使用して別のソケットにメッセージを送信し、応答を受信します。」

「ソケットにメッセージを送信する方法は次のとおりです。」

// Create a socket
Socket clientSocket = new Socket("localhost", 4444);

// Get an OutputStream
OutputStream outputStream = clientSocket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream, true);
out.println("Kiss my shiny metal ass!");
out.flush();

// Read the response
InputStream inputStream = clientSocket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String answer = in.readLine();

「それはすべて、インターネットからファイルをダウンロードするのとよく似ています。」

「それは、そこでもソケットが使用されているからです。」

「ソケットは、ネットワークに関連するあらゆるもの、つまりほとんどすべての中心にあります。」

「追加情報はここで読むことができます」

「教えてくれてありがとう、リシ」

「まだ終わっていない。それは希望的観測だ」

「次に、サーバーソケットがどのように機能するかを見てみましょう。」

「それはもう少し複雑です。」

// Create a server socket object
ServerSocket serverSocket = new ServerSocket(4444); // Port

// Process incoming connections in a loop
while (true)
{
 // The accept method waits for someone to connect
 Socket socket = serverSocket.accept();

 // Read the response
 InputStream inputStream = socket.getInputStream();
 BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
 String message = in.readLine();

 // Create a response - we'll just reverse the string
 String reverseMessage = new StringBuilder(message).reverse().toString();

 // Send the response
 OutputStream outputStream = socket.getOutputStream();
 PrintWriter out = new PrintWriter(outputStream, true);
 out.println(reverseMessage);
 out.flush();
}

「いくつかの点に注意していただきたいと思います。」

「ポイント 1: (クライアント) ソケットを作成するには、IP アドレス (またはドメイン名) とポートを指定する必要があります。サーバー ソケットを作成するには、ポートを指定するだけです。サーバー ソケットは、次のコンピュータ上にのみ存在します。それは作られた。"

「ポイント 2: ServerSocket クラスには、受信接続を待機する accept() メソッドがあります。つまり、このメソッドは、クライアント ソケットが接続を試行するまで永久に実行されます。その後、accept() メソッドは接続を受け入れ、ソケットを作成しますオブジェクトを使用して通信を許可し、このオブジェクトを返します。」

「Java プログラマの観点から見ると、ソケットは 2 つのストリームです。1 つはメッセージ/データを読み取る入力ストリーム、もう 1 つはメッセージ/データを書き込む出力ストリームです。」

「サーバー ソケットを作成すると、実際には、他のコンピュータ上のクライアント ソケットが接続できるポートを作成することになります。ただし、これを行うには、ソケットのポート番号とコンピュータの IP アドレスを正しく指定する必要があります。またはそのドメイン名。」

「これは興味深い例です。詳しく調べて実行してみてください。」

https://www.logicbig.com/tutorials/core-java-tutorial/http-server/http-server-basic.html

「重要なのは、サーバー ソケットを使用して、ブラウザから簡単にアクセスできる超原始的な Web サーバーを作成することです。」

「すごい! Web サーバー? すごい! 注意深く勉強してみます。」

「ありがとう、リシ」

「以上です、アミーゴ。リラックスしてください!」