Java は、1995 年 5 月に Sun Microsystems によって発売された高級プログラミング言語です。 Java は、Windows、Mac OS、その他の UNIX バージョンのシステムなどの複数のプラットフォームで実行できます。静的オブジェクト指向プログラミング言語の代表である Java 言語は、オブジェクト指向理論を完全に実装しており、プログラマーが洗練された考え方で複雑なプログラミングを実行できるようにします。 「Geek Academy Java ビデオ チュートリアル」では、浅いところから深いところまで、基礎から高度なところまで Java 言語の世界にあなたを導きます。
コース再生アドレス: http://www.php.cn/course/275.html
先生の教え方:
先生の講義はシンプルで奥深く、わかりやすいです論理的思考力を使用して生徒の注意を引き、理性を使用して教室での指導プロセスを制御することで、層ごとに連動し、厳密な議論と厳密な構造を組織化して分析します。先生の講義を聞くことで、学生は知識を学ぶだけでなく、思考力のトレーニングも受け、先生の厳しい学問的姿勢に影響を受け、影響を受けます
このビデオの最も難しい点は、Javaでのソケット通信です
まず、ネットワーク プログラミングには 2 つの主な問題があります
1 つは、ネットワーク上で 1 つ以上のホストを正確に見つける方法であり、もう 1 つは、ホストを見つけた後にデータを確実かつ効率的に送信する方法です。
TCP/IP プロトコルでは、IP 層は主にネットワーク ホストの位置決めとデータ送信のルーティングを担当します。IP アドレスはインターネット上のホストを一意に決定します。
TCP 層は、アプリケーション指向の信頼できる (tcp) または信頼できない (UDP) データ送信メカニズムを提供します。これは、ネットワーク プログラミングの主な目的です。通常、IP 層がデータを処理する方法を気にする必要はありません。
現在、より一般的なネットワーク プログラミング モデルは、クライアント/サーバー (C/S) 構造です。つまり、通信当事者の 1 つがサーバーとして機能し、クライアントが要求を行って応答するのを待ちます。顧客はサービスが必要なときにサーバーに申し込みます。通常、サーバーは常にデーモン プロセスとして実行され、顧客の要求があるとネットワーク ポートをリッスンし、顧客に応答するサービス プロセスを開始すると同時に、後続の顧客がサービス ポートを監視し続けます。時間内にサービスを受けることができます。
2 番目の 2 種類の伝送プロトコル: TCP、UDP
TCP は Transfer Control Protocol の略称で、信頼性の高い伝送を保証する接続指向のプロトコルです。 TCP プロトコルを通じて送信されると、エラーのないシーケンシャルなデータ ストリームが取得されます。 TCP プロトコルに基づいて通信するには、送信側と受信側の 2 つのソケット間で接続を確立する必要があります。一方のソケット (通常はサーバー ソケット) が接続の確立を待機しているときに、もう一方のソケットが接続を要求できます。 、2 つのソケットが接続されると、双方向のデータ送信を実行でき、双方が送信または受信操作を実行できます。
UDP は、User Datagram Protocol の略称であり、各データグラムは完全な送信元アドレスまたは宛先アドレスを含む独立した情報であり、ネットワーク上のあらゆるパスを通じて送信されます。 、目的地への到達能力、目的地までの時間、内容の正確性は保証できません。
比較:
UDP: 1、完全なアドレス情報が各データグラムに与えられるため、送信者と受信者の間で接続を確立する必要はありません。
2. UDP がデータを送信するときはサイズ制限があり、送信される各データグラムは 64KB に制限される必要があります。
3. UDP は信頼性の低いプロトコルです。送信者によって送信されたデータグラムは必ずしも同じ順序で受信者に到着するとは限りません。
TCP: 1. ソケット間のデータ送信を確立するために使用する必要がある接続指向のプロトコルです。接続の場合、TCP での接続には
時間がかかります。
2. TCP 送信データのサイズ制限。接続が確立されると、双方のソケットは統一された形式で大きな
データを送信できます。
3. TCP は信頼性の高いプロトコルであり、受信者が送信者によって送信されたすべてのデータを完全かつ正確に取得することを保証します。
アプリケーション:
1. TCP は、ネットワーク通信で強力な活力を持っています。たとえば、リモート接続 (Telnet) やファイル転送 (FTP) では、可変長のデータを確実に送信する必要があります。ただし、信頼性の高い送信には代償が伴い、データ コンテンツの正確性を確認するには必然的にコンピュータの処理時間とネットワーク帯域幅が消費されます。そのため、TCP 送信は UDP ほど効率的ではありません。
2. UDP は操作が簡単で、監視が少なくて済むため、通常、ローカル エリア ネットワークで信頼性の高い分散システムのクライアント/サーバー アプリケーションに使用されます。たとえば、ビデオ会議システムでは、連続性が確保されている限り、音声およびビデオ データが完全に正しい必要はありません。この場合、UDP を使用する方が明らかに合理的です。
三、ソケットに基づく Java ネットワークプログラミング
1. ソケットとは何ですか? ネットワーク上の 2 つのプログラムは、双方向通信接続を通じてデータを交換します。ソケットは通常、クライアントとサーバー間の接続を実現するために使用されます。ソケットは、TCP/IP プロトコルの非常に一般的なプログラミング インターフェイスであり、IP アドレスとポート番号によって一意に決定されます。
ただし、Socket がサポートするプロトコルの種類は TCP/IP に限定されないため、両者の間に接続は必要ありません。 Java 環境では、ソケット プログラミングは主に TCP/IP プロトコルに基づくネットワーク プログラミングを指します。
2. ソケット通信のプロセス
サーバーは特定のポートに接続リクエストがあるかどうかを確認し、クライアントはサーバーに Connect リクエストを送信し、サーバーはクライアントに Accept メッセージを返します。接続が確立されます。サーバー側とクライアント側はどちらも、Send や Write などのメソッドを通じて相互に通信できます。
完全に機能するソケットには次の基本構造が含まれている必要があり、その作業プロセスには次の 4 つの基本ステップが含まれます:
(1) ソケットを作成する;
(2) ソケットに接続されている入力/出力ストリームを開きます。 ;
(3) 特定のプロトコルに従ってソケット上で読み取り/書き込み操作を実行します。プログラムでは、プログラム自体が比較的単純で要件も高くないため、影響はありません)
3. Socket の作成
Socket の作成
java では、Socket と ServerSocket の 2 つのクラスが提供されます。パッケージ java.NET。双方向接続のクライアントとサーバーをそれぞれ表すために使用されます。これら 2 つのクラスは非常によくカプセル化されており、非常に使いやすいです。その構築方法は以下の通りです:
Socket(InetAddress address, int port); Socket(InetAddress address, int port, boolean stream); Socket(String host, int prot); Socket(String host, int prot, boolean stream); Socket(SocketImpl impl) Socket(String host, int port, InetAddress localAddr, int localPort) Socket(InetAddress address, int port, InetAddress localAddr, int localPort) ServerSocket(int port); ServerSocket(int port, int backlog); ServerSocket(int port, int backlog, InetAddress bindAddr)
ここで、address、host、portはそれぞれ双方向接続の相手のIPアドレス、ホスト名、ポート番号で、streamはソケットがストリームソケットかデータグラムかを示します。ソケット、localPort はローカル ホストのポート番号を示し、localAddr とbindAddr はローカル マシンのアドレス (ServerSocket のホスト アドレス)、impl はソケットの親クラスであり、serverSocket と Socket の両方を作成するために使用できます。 。 count は、サーバーがサポートできる接続の最大数を表します。例: Learning Video Network http://www.php.cn
Socket client = new Socket("127.0.01.", 80); ServerSocket server = new ServerSocket(80);
ポートを選択するときは注意が必要です。各ポートは特定のサービスを提供します。正しいポートを指定することによってのみ、対応するサービスを取得できます。 0 ~ 1023 のポート番号はシステムによって予約されています。たとえば、http サービスのポート番号は 80、Telnet サービスのポート番号は 21、ftp サービスのポート番号は 23 です。したがって、ポートを選択するときは次のようになります。番号が競合しないように、1023 より大きいポート番号を選択することをお勧めします。
ソケット作成時にエラーが発生した場合はIOExceptionが発生するので、プログラム内で処理する必要があります。したがって、Socket または ServerSocket を作成するときは、例外をキャッチまたはスローする必要があります。
4、単純なクライアント/サーバープログラム
1.クライアントプログラム
import java.io.*; import 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)); //由系统标准输入设备构造BufferedReader对象 PrintWriter os=new PrintWriter(socket.getOutputStream()); //由Socket对象得到输出流,并构造PrintWriter对象 BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream())); //由Socket对象得到输入流,并构造相应的BufferedReader对象 String readline; readline=sin.readLine(); //从系统标准输入读入一字符串 while(!readline.equals("bye")){ //若从标准输入读入的字符串为 "bye"则停止循环 os.println(readline); //将从系统标准输入读入的字符串输出到Server os.flush(); //刷新输出流,使Server马上收到该字符串 System.out.println("Client:"+readline); //在系统标准输出上打印读入的字符串 System.out.println("Server:"+is.readLine()); //从Server读入一字符串,并打印到标准输出上 readline=sin.readLine(); //从系统标准输入读入一字符串 } //继续循环 os.close(); //关闭Socket输出流 is.close(); //关闭Socket输入流 socket.close(); //关闭Socket }catch(Exception e) { System.out.println("Error"+e); //出错,则打印出错信息 } } }
2.サーバーサイドプログラム
import java.io.*; import java.Net.*; import java.applet.Applet; public class TalkServer{ public static void main(String args[]) { try{ ServerSocket server=null; try{ server=new ServerSocket(4700); //创建一个ServerSocket在端口4700监听客户请求 }catch(Exception e) { System.out.println("can not listen to:"+e); //出错,打印出错信息 } Socket socket=null; try{ socket=server.accept(); //使用accept()阻塞等待客户请求,有客户 //请求到来则产生一个Socket对象,并继续执行 }catch(Exception e) { System.out.println("Error."+e); //出错,打印出错信息 } String line; BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream())); //由Socket对象得到输入流,并构造相应的BufferedReader对象 PrintWriter os=newPrintWriter(socket.getOutputStream()); //由Socket对象得到输出流,并构造PrintWriter对象 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); //由系统标准输入设备构造BufferedReader对象 System.out.println("Client:"+is.readLine()); //在标准输出上打印从客户端读入的字符串 line=sin.readLine(); //从标准输入读入一字符串 while(!line.equals("bye")){ //如果该字符串为 "bye",则停止循环 os.println(line); //向客户端输出该字符串 os.flush(); //刷新输出流,使Client马上收到该字符串 System.out.println("Server:"+line); //在系统标准输出上打印读入的字符串 System.out.println("Client:"+is.readLine()); //从Client读入一字符串,并打印到标准输出上 line=sin.readLine(); //从系统标准输入读入一字符串 } //继续循环 os.close(); //关闭Socket输出流 is.close(); //关闭Socket输入流 socket.close(); //关闭Socket server.close(); //关闭ServerSocket }catch(Exception e){ System.out.println("Error:"+e); //出错,打印出错信息 } } }
5、複数のクライアントをサポートするクライアント/サーバープログラム
以前のクライアント/サーバープログラムはサーバー会話のみを実装できますクライアントと一緒に。実際のアプリケーションでは、多くの場合、永続的なプログラムがサーバー上で実行され、他の複数のクライアントからのリクエストを受信し、対応するサービスを提供できます。サーバー側で複数のクライアントにサービスを提供する機能を実現するには、上記のプログラムを修正し、マルチスレッドを使用してマルチクライアント機構を実装する必要があります。サーバーは、指定されたポートに顧客のリクエストがあるかどうかを常に監視します。顧客のリクエストが監視されると、サーバーは顧客のリクエストに応答するために特別なサービス スレッドを開始し、サーバー自体はスレッドの開始直後にリスニング状態に入ります。 . 次のお客様の到着を待っています。
以上がGeek Academy Java ビデオ チュートリアル リソースの共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。