1.ネットワークプログラミングにおける2つの主な問題
1つは、ネットワーク上に1つ以上のホストを正確に見つける方法であり、もう1つはホストを見つけた後にデータを確実に効率的に送信する方法です。
TCP/IPプロトコルでは、IPレイヤーは主にネットワークホストの位置とデータ送信のルーティングを担当します。 IPアドレスは、インターネット上のホストを一意に決定できます。
TCPレイヤーは、ネットワークプログラミングの主なオブジェクトであるアプリケーションのための信頼性の高い(TCP)または非信頼できない(UDP)データ送信メカニズムを提供し、一般にIPレイヤーがデータを処理する方法を気にする必要はありません。
現在最も人気のあるネットワークプログラミングモデルは、クライアント/サーバー(C/S)構造です。つまり、通信当事者の1つは、顧客がリクエストを送信して応答するのを待つサーバーとして機能します。顧客は、サービスが必要なときにサーバーに適用されます。通常、サーバーは常にデーモンとして実行されており、ネットワークポートを聴きます。顧客がそれを要求すると、顧客に応答するためのサービスプロセスを開始し、同時にサービスポート自体を聴き続け、後の顧客もタイムリーにサービスを受けることができます。
2。2種類の伝送プロトコル:TCP; UDP
TCPは、信頼できる伝送を保証する接続指向プロトコルであるTranfer Control Protocolの略語です。 TCPプロトコルを介した送信は、エラーのないデータストリームの順序になります。 TCPプロトコルに基づいて通信するには、送信者と受信機の2つのペアの間に接続を確立する必要があります。 1つのソケット(通常はサーバーソケット)が接続の確立を待っている場合、もう1つのソケットには接続が必要になります。これらの2つのソケットが接続されると、双方向のデータ送信を実行でき、両当事者は送信または受信操作を実行できます。
UDPは、 User Datagram Protocolの略語です。それはコネクションレスプロトコルです。各データグラムは、完全なソースまたは宛先アドレスを含む独立した情報です。可能なパスによってネットワーク上の宛先に送信されます。したがって、目的地に到達できるかどうか、目的地に到達する時間、コンテンツの正しさを保証することはできません。
比較する:
UDP:
TCP:
応用:
3。ソケットベースのJavaネットワークプログラミング
1。ソケットとは何ですか
ネットワーク上の2つのプログラムは、双方向通信接続を通じてデータ交換を実現します。この双方向リンクの一方の端は、ソケットと呼ばれます。ソケットは通常、顧客とサービスプロバイダー間で接続するために使用されます。 Socketは、TCP/IPプロトコルの非常に人気のあるプログラミングインターフェイスです。ソケットは、IPアドレスとポート番号によって一意に決定されます。
ただし、ソケットでサポートされるプロトコルのタイプはTCP/IPであるだけではないため、2つの間に必要な接続はありません。 Java環境では、ソケットプログラミングとは、主にTCP/IPプロトコルに基づくネットワークプログラミングを指します。
2。ソケット通信のプロセス
サーバー側は、特定のポートに接続リクエストがあるかどうかを聞きます(耳を傾けます)。クライアント側は、サーバー側への接続要求を発行し、サーバー側はクライアント側に受け入れメッセージを送り返します。接続が確立されます。サーバー側とクライアント側の両方は、送信、書き込み、その他の方法を通じて相互に通信できます。
完全に機能するソケットの場合、次の基本構造を含める必要があり、その作業プロセスには次の4つの基本的な手順が含まれます。
(1)ソケットを作成します。
(2)ソケットに接続された入力/アウトフローを開きます。
(3)特定のプロトコルに従ってソケットの読み取り/書き込み。
(4)ソケットを閉じます。 (実際のアプリケーションでは、表示された閉鎖は使用されません。多くの記事はこれを推奨していますが、私のプログラムでは、プログラム自体が比較的単純で要件が低いため、影響がない場合があります。)
3.ソケットを作成します
Socket(InetAddressアドレス、INTポート);ソケット(InetAddressアドレス、INTポート、ブールストリーム); Socket(String Host、Int Prot); Socket(String Host、Int Prot、Boolean Stream); Socket(SocketImpl Imple)ソケット(String Host、Int Port、InetAddress localAddr、int localport)Socket(inetAddressアドレス、intポート、InetAddress localAddr、int localport)serversocket(int port); Serversocket(int port、intバックログ); serversocket(int port、int backlog、inetAddress bindaddr)。アドレス、ホスト、ポートは、それぞれ双方向接続におけるIPアドレス、ホスト名、ポート番号です。ストリームは、ソケットがストリームソケットかデータグラムソケットかを示します。 LocalPortは、ローカルホストのポート番号、LocalAddrとBindaddrがローカルマシン(Serversocketのホストアドレス)のアドレスであることを示しています。 ImpLは、Socketの親クラスで、Serversocketを作成してソケットを作成するために使用できます。カウントは、サーバーがサポートできる接続の最大数を表します。例:ビデオネットワークの学習http://www.xxspw.comソケットクライアント= new Socket( "127.0.01。"、80); Serversocket Server = new Serversocket(80);
ポートを選択するときは注意する必要があることに注意してください。各ポートは特定のサービスを提供します。正しいポートを提供することによってのみ、対応するサービスを取得できます。 0〜1023のポート番号は、システムによって予約されています。たとえば、HTTPサービスのポート番号は80、Telnetサービスのポート番号は21、FTPサービスのポート番号は23です。したがって、ポート番号を選択すると、競合を防ぐために1023を超える数字を選択するのが最善です。
ソケットを作成するときにエラーが発生した場合、IOExceptionが生成され、プログラムで処理する必要があります。そのため、ソケットまたはサーバーソケットを作成するときは、例外をキャッチまたはスローする必要があります。
4。シンプルなクライアント/サーバープログラム
1。クライアントプログラム
java.io.*をインポートします。 java.net。*; public class talkclient {public static void main(string args []){try {socket socket = new Socket( "127.0.0.1"、4700); //クライアントリクエストをマシンの4700ポートに送信しますbufferedReader sin = new BufferedReader(new inputStreamReader(System.in)); //システムからバッファレッドリーダーオブジェクトを作成します標準入力デバイスprintwriter os = new PrintWriter(socket.getOutputStream()); //ソケットオブジェクトから出力ストリームを取得し、printWriterオブジェクトBufferedReader is = new BufferedReader(new inputStreamReader(socket.getInputStream())); //ソケットオブジェクトから入力ストリームを取得し、対応するbufferedreaderオブジェクト文字列readlineを構築します。 readline = sin.readline(); //システムの標準入力から文字列を読み取りますwhile(!readline.equals( "bye")){//標準入力から読み取られた場合、標準入力から読み取られた場合、loop os.println(readline)を停止します。 // System Standard InputからServer OS.Flush()への文字列を出力します。 //出力ストリームを更新して、サーバーがstring system.out.println( "client:"+readline)をすぐに受信するようにします。 // read string system.out.println( "server:"+is.readline())を印刷します。 //サーバーから文字列を読み取り、標準の出力readline = sin.readline()に印刷します。 //システム標準入力から文字列を読み取る} // os.close()を継続します; //ソケット出力ストリームを閉じるclose(); //ソケット入力ストリームsocket.close()を閉じる; // close socket} catch(例外e){system.out.println( "error"+e); //エラーが発生し、エラーメッセージが印刷されます}}}2。サーバー側プログラム
java.io.*をインポートします。 java.net。*; Import Java.Applet.Applet; public class talkserver {public static void main(string args []){try {serversocket server = null; try {server = new Serversocket(4700); //ポート4700で顧客リクエストをリッスンするためにサーバーソケットを作成します} catch(例外e){system.out.println( "聴くことはできません:"+e); //エラー、印刷エラーメッセージ}ソケットソケット= null; try {socket = server.accept(); // accept()を使用して、クライアントリクエストをブロックして待ちます。クライアント//リクエストが発生した後、ソケットオブジェクトが生成され、実行され続けます} catch(例外e){system.out.println( "error。"+e); //エラーが発生し、印刷エラー情報が印刷されます}文字列行。 BufferedReaderは= new BufferedReader(new inputstreamReader(socket.getInputStream())); //ソケットオブジェクトから入力ストリームを取得し、対応するbufferedReaderオブジェクトPrintWriter os = newPrintWriter(socket.getOutputStream())を作成します。 //ソケットオブジェクトから出力ストリームを取得し、printWriterオブジェクトBufferedReader sin = new BufferedReader(new inputstreamReader(system.in))を作成します。 // bufferedreader object system.out.println( "client:"+is.readline())を作成します。 //標準の出力行= sin.readline()で文字列をクライアントから読み取ります; //標準入力while(!line.equals( "bye")){//文字列が「さようなら」の場合、loop os.println(line)を停止します。 //文字列os.flush()をクライアントに出力します。 //出力ストリームを更新して、クライアントがstring system.out.println( "server:"+line)をすぐに受信するようにします。 // read string system.out.println( "client:"+is.readline())を印刷します。 //クライアントから文字列を読み取り、標準の出力行= sin.readline()に印刷します。 //システム標準入力から文字列を読み取る} // os.close()を継続します; //ソケット出力ストリームを閉じるclose(); //ソケット入力ストリームsocket.close()を閉じる; // socket server.close(); // close serversocket} catch(Exception e){system.out.println( "error:"+e); //エラーが発生した、印刷エラーメッセージ}}}5.マルチクライアントクライアント/サーバープログラムをサポートします
以前のクライアント/サーバープログラムは、サーバーと1人の顧客間の会話のみを実装できます。実際のアプリケーションでは、多くの場合、サーバーで永続的なプログラムが実行され、他の複数のクライアントからリクエストを受信し、対応するサービスを提供できます。サーバー上の複数の顧客にサービスを提供する機能を実現するには、上記のプログラムを変換し、マルチスレッドメカニズムを実装する必要があります。サーバーは、指定されたポートにクライアントリクエストがあるかどうかを常に聴きます。クライアントの要求が聞こえると、サーバーはクライアントのリクエストに応答するために特別なサービススレッドを開始します。サーバー自体は、スレッドを起動した後、すぐにリスニング状態に入り、次のクライアントが到着するのを待ちます。