ソケットとも呼ばれるソケットは、コンピューターネットワーク通信の基本的なテクノロジーの1つです。今日、ブラウザ、インスタントメッセージングツール、さらにはP2PのダウンロードなどのほとんどのWebベースのソフトウェアがソケットに基づいて実装されています。この記事では、TCP/IPとクライアント/サーバープログラムの書き方に基づいてソケットプログラミングを紹介します。
夕食前のデザート
Unixの入力および出力(IO)システムは、Open-Read-Write-Closeなどの動作テンプレートに従います。ユーザープロセスがIO操作を実行する前に、ファイルまたはデバイスを操作して読み書きのために指定および取得するためにオープンを呼び出す必要があります。 IO操作オブジェクトが開かれると、ユーザープロセスはオブジェクトで1つ以上の読み取りまたは書き込み操作を実行できます。読み取り操作は、IO操作オブジェクトのデータを読み取り、データをユーザープロセスに渡すために使用されます。書き込み操作は、ユーザープロセスのデータをIO操作オブジェクトに渡す(書き込み)するために使用されます。すべての読み取り操作が完了した後、ユーザープロセスは、IOオブジェクトの使用を完了することをシステムに通知するために近くで呼び出す必要があります。
UNIXがインタープロセス通信(IPC)をサポートし始めたとき、IPCインターフェイスは、ファイルIO操作インターフェイスに似ているように設計されました。 UNIXでは、プロセスには、読み書きできるIO記述子のセットがあります。 IO記述子は、ファイル、デバイス、または通信チャネル(ソケットソケット)にすることができます。ファイル記述子は、3つの部分で構成されています。データの作成(ソケットを開く)、データの読み取りおよび書き込み(ソケットへの受け入れと送信)、破壊(ソケットの閉鎖)。
UNIXシステムでは、IPCインターフェイスのBSD様バージョンがTCPおよびUDPプロトコルの上のレイヤーとして実装されています。メッセージの宛先は、ソケットアドレスで表されます。ソケットアドレスは、ネットワークアドレスとポート番号で構成される通信識別子です。
インタープロセス通信操作には、一対のソケットが必要です。インタープロセス通信は、あるプロセスで1つのソケット間のデータ送信と別のプロセスで別のソケットによって達成されます。メッセージが実行されて送信されると、下位レベルのネットワークプロトコルがメッセージを送信するまで、メッセージは送信端のソケットにキューに巻き込まれます。メッセージが受信側のソケットに到達すると、受信側のプロセスがメッセージを受信するまでキューになります。
TCPおよびUDP通信
ソケットプログラミングに関しては、選択できる2つの通信プロトコルがあります。 1つはデータグラム通信、もう1つはストリーム通信です。
データグラム通信
Datagram通信プロトコルは、頻繁にUDP(ユーザーデータプロトコル)と呼ばれるものです。 UDPはコネクションレスプロトコルです。つまり、データグラムを送信するたびに、ネイティブマシンのソケット記述子とレシーバーのソケット記述子を同時に送信する必要があります。したがって、通信するたびに追加のデータを送信する必要があります。
ストリーム通信
TCP(転送制御プロトコル)としても知られるストリーム通信プロトコルは、TCP(転送制御プロトコル)とも呼ばれます。 UDPとは異なり、TCPは接続ベースのプロトコルです。ストリーム通信を使用する前に、ソケットの通信ペア間の接続を確立する必要があります。ソケットの1つは、接続要求をリッスンするサーバーとして機能します。もう1つは、クライアントとして接続要求を行います。 2つのソケットが接続を確立すると、片道または双方向でデータを転送できます。
これを読んだ後、ソケットプログラミングにUDPまたはTCPを使用するかどうかについていくつかの質問があります。特定のアプリケーションシナリオに基づいているプロトコルに基づくソケットプログラミングの選択は、特定のクライアントサーバープログラムに依存します。以下に、TCPプロトコルとUDPプロトコルの違いを簡単に分析します。これにより、使用するものをより適切に選択するのに役立ちます。
UDPでは、データグラムが送信されるたびに、ネイティブマシンのソケット記述子とレシーバーのソケット記述子を含める必要があります。 TCPは接続ベースのプロトコルであるため、通信前の通信ソケットペア間に接続を確立する必要があるため、TCPプロトコルには時間のかかる接続プログラミングが行われます。
UDPでは、データグラムのデータのサイズは64kbの制限です。 TCPにはそのような制限はありません。 TCP通信のソケットペアが接続を確立すると、それらの間の通信はIOストリームに似ており、すべてのデータが受け入れられる順序で読み取られます。
UDPは信頼性の低いプロトコルであり、送信されたデータグラムは、送信される順序で受信ソケットによって必ずしも受け入れられるわけではありません。 TCPは信頼できるプロトコルです。受信側によって受信されたパケットの順序は、送信端のパケットの順序と一致しています。
要するに、TCPは、リモートログイン(Rlogin、Telnet)やファイル転送(FTP)などのネットワークサービスに適しています。送信する必要があるこれらのデータのサイズは不確実であるためです。 UDPはTCPよりもシンプルで軽量です。 UDPは、よりリアルタイムまたはパケット損失の重要性のない一部のサービスを実装するために使用されます。 LANのUDPのパケット損失率は比較的低いです。
Javaのソケットプログラミング
次のセクションでは、いくつかの例を介してクライアントプログラムとサーバープログラムを作成するためにソケットを使用する方法について説明します。
注:次の例では、このプロトコルはUDP/IPよりもはるかに広く使用されているため、TCP/IPプロトコルに基づいてソケットプログラミングを使用します。また、すべてのソケット関連クラスはjava.netパッケージの下にあるため、ソケットプログラミングを行っているときはこのパッケージを導入する必要があります。
クライアントライティング
ソケットをオンにします
クライアント側にいる場合は、ソケットを開くには次のコードを記述する必要があります。
string host = "127.0.0.1"; int port = 8919; socket client = new Socket(host、port);
上記のコードでは、ホストはクライアントが接続する必要があるマシンであり、ポートはリクエストを聞くためにサーバーが使用するポートです。ポートを選択するとき、注意する必要があることの1つは、0〜1023などのポートがシステムによって予約されていることです。これらのポートは、メール、FTP、HTTPなど、一般的に使用されるサービスによって使用されます。サーバー側のコードを作成してポートを選択している場合は、1023を超えるポートを選択してください。
データを書き込みます
次に、リクエストデータを書き込むことです。クライアントのソケットオブジェクトから出力ストリームオブジェクトを取得し、データを書き込みます。ファイルIO処理コードに非常に似ています。
public class clientsocket {public static void main(string args []){string host = "127.0.0.1"; int port = 8919; try {socket client = new Socket(host、port); Writer Writer = new outputStreamWriter(client.getOutputStream()); writer.write( "hello from client"); writer.flush(); writer.close(); client.close(); } catch(ioexception e){e.printstacktrace(); }}}IOオブジェクトを閉じます
IOと同様に、データを読み書きした後、IOオブジェクトを閉じて、リソースの正しいリリースを確保する必要があります。
サーバー側の書き込み
サーバー側のソケットを開きます
int port = 8919; serversocket server = new Serversocket(port); socket socket = server.accept();
上記のコードはサーバー側のソケットを作成し、その後、クライアントのリクエストソケットを聞いて取得するために、受け入れメソッドを呼び出します。 Acceptメソッドは、サーバーとクライアントの間に接続が行われるまでブロックを待つブロッキングメソッドです。
データを読む
上記のソケットオブジェクトを介して入力ストリームオブジェクトを取得し、ファイルIOをインストールしてデータを読み取ります。ここでは、コンテンツを印刷します。
public class serverClient {public static void main(string [] args){int port = 8919; try {Serversocket server = new Serversocket(port); SocketSocket = server.accept(); reader reader = new inputStreamReader(socket.getInputStream()); char chars [] = new char [1024]; int len; stringbuilder builder = new StringBuilder(); while((len = reader.read(chars))!= -1){builder.append(new String(chars、0、len)); } system.out.println( "クライアントメッセージ=:" + builderから受信); reader.close(); socket.close(); server.close(); } catch(Exception e){e.printstacktrace(); }}}IOオブジェクトを閉じます
忘れられません。最後に、リソースの正しいリリースを確保するために、IOオブジェクトを正しく閉じる必要があります。
例に注意してください
ここでは、ソケットを使用してエコーサーバーを実装する例を追加します。つまり、サーバーはクライアントから送信されたデータをクライアントに戻します。コードは非常に簡単です。
java.io。*;インポートJava.net。*; public class eChoServer {public static void main(String args []){//宣言セクション://サーバーソケットとクライアントソケットを宣言//入力と出力ストリームServersocket echoserver = nullを宣言します。文字列線; datainputStreamは次のとおりです。 PrintStream OS; Socket ClientSocket = null; //ポート9999でサーバーソケットを開くようにしてください} catch(ioException e){system.out.println(e); } // Serversocketからソケットオブジェクトを作成して、//接続を聴き、受け入れます。 //入力および出力ストリームを開くtry {clientsocket = echoserver.accept(); IS = new DatainputStream(ClientSocket.GetInputStream()); OS = new PrintStream(ClientSocket.GetOutputStream()); //データを受け取る限り、そのデータをクライアントに戻します。 while(true){line = is.readline(); os.println(line); }} catch(ioException e){system.out.println(e); }}}上記のコードをコンパイルして実行し、次のリクエストを作成すると、クライアントリクエストによって運ばれるデータのコンテンツを確認できます。
15:00 $ curl http://127.0.0.1:9999/?1111111111111.1.1user-agent:curl/7.37.1host:127.0.0.0.1:9999accept: */ *
要約します
クライアントサーバープログラミングを実行することは非常に興味深いものであり、Javaでのソケットプログラミングは、他の言語(Cなど)よりも簡単かつ高速です。
java.netパッケージには、開発者がネットワークをプログラムするための多くの強力で柔軟なクラスが含まれています。プログラミングネットワークの場合、このパッケージの下のAPIを使用することをお勧めします。同時に、Sun.*パッケージには多くのネットワークプログラミング関連のクラスも含まれていますが、このパッケージが変更される可能性があるため、このパッケージの下のAPIを使用することはお勧めしません。さらに、このパッケージをすべてのプラットフォームに含めることを保証することはできません。
上記は、Javaソケット情報の編集です。将来、関連する知識を追加し続けます。このウェブサイトへのご支援ありがとうございます!