1、ソケットの原則
ソケットは、本質的に、エンドポイント・プロセス間通信を提供します。通信の処理の前に、双方が最初のそれぞれの端部を作成する必要があり、そうでなければ接触を確立し、相互に通信する方法はありません。以前と呼ばれるように、2つの側面は、それぞれ異なる携帯電話を持っている必要があります。
監視サーバー、クライアント要求、接続確認:ソケットとの接続方法は3つのステップに分けることができます。
サーバー側のソケットが特定のクライアントソケットをターゲットにしていませんが、接続待ちの状態で、リアルタイムのネットワーク状態の監視:1、サーバが監視します。
図2に示すように、クライアントの要求は、ターゲットサーバ側ソケットに接続されたクライアントソケットによって行われた接続要求を意味します。このため、クライアントソケットは、サーバー側のソケットのアドレスとポート番号を指摘し、それに接続するためのサーバソケットを記述する必要があり、その後のサーバソケットへの接続要求を行いました。
3、接続確認:サーバーがリスニングソケットを参照するか、クライアントソケットの接続要求を受信した場合、それは新しいスレッドを作成するには、クライアントソケットの要求に応答します、サーバー側ソケットクライアントへの単語の説明は、クライアントはこの説明を確認すると、良好な接続が確立されています。そしてサーバーソケットがリスニング状態に続く、ソケットに接続された他のクライアントからの要求を受信し続けています。
2、ソケットベースのプログラミングのJava
クライアント:
インポートjava.io.InputStreamを、 インポートにjava.io.OutputStream、 インポートのjava.net.Socket、 パブリック クラスクライアント{ 公共 静的 ボイドメイン(文字列引数[])をスロー例外{ // 設定ローカルホスト、ポートに接続し、サービスおよび最後まで一貫した 列ホスト=「127.0.0.1」を; int型ポート= 23333 ; // 介してサーバとのソケット接続を確立する ソケットソケット= 新しい新しいソケット(ホスト、ポート); IF (socket.isConnected()){ のSystem.out .println( "接続!" ); } // 送信される情報は、出力ストリームに書き込まれ たOutputStream出力= Socket.getOutputStreamを(); 文字列が送信され、 "こんにちは" = ; 。Socket.getOutputStream()ライト(sent.getBytes( "UTF-8" )); // 閉じる顧客出力ストリームの終わり(一方向、ソケットを閉じていない) socket.shutdownOutput(); のSystem.out.println(「サーバーに送信されるメッセージ:」+ 送られる); // 読み出す入力ストリームがサーバから返され たInputStream入力= ソケット。 getInputStream(); バイト []バイト= 新しい新しい バイト [1024 ]; int型のlen; StringBuilderのGET = 新しい新StringBuilder(); 一方、(!(LEN = input.read(バイト))= -1 ){ get.append(新しい文字列(バイト0、lenを、 "UTF-8" )); } のSystem.out.println( "サーバからGETメッセージ:" + GET)。 // 关闭ソケット input.close(); output.close(); socket.close(); } }
サーバー側:
java.io.InputStreamをインポートし、 インポートにjava.io.OutputStream、 インポートjava.net.ServerSocket、 インポートのjava.net.Socket; publicクラスサーバー{ 公共の静的な無効メイン(文字列[]引数)は例外{スロー //が指定盗聴しますクライアントは、このポートに接続されるまで、ポートは、ブロック INTポート= 23333; ServerSocketを新しい新しい= ServerSocketをサーバー(ポート); System.out.printlnは(「待っているサーバー...」); ソケットソケットserver.acceptを=(); システム。 out.printlnを(「接続!」); //入力ストリームが後端に戻り、クライアントから返される-1に読み出さ のInputStream Socket.getInputStream入力=(); バイト[]バイト=新しい新しいバイト[1024]; int型LEN、 StringBuilderのStringBuilderの新しい新しいGET =(); (!(LEN = input.read(バイト))= -1){一方 get.append(新しい文字列(バイト0、lenを、 "UTF-8")); } のSystem.out.println( "クライアントからGETメッセージ:" + GET)。 OutputStreamの出力= socket.getOutputStream()。 文字列は、「こんにちは」=送信され; output.write(sent.getBytes( "UTF-8")); System.out.println(「クライアントに送信されたメッセージ:」+送られます)。 //关闭ソケット与服务器端 input.close(); output.close(); socket.close(); server.close(); } }
結果:
最初に実行サーバ
次に、クライアントを実行します
そして、サーバ側の結果
3、プログラムのアイデア
(1)建立一个服务器ServerSocket,并同时定义好ServerSocket的监听端口;
(2)ServerSocket 调用accept()方法,使之处于阻塞。
(3)创建一个客户机Socket,并设置好服务器的IP和端口。
(4)客户机发出连接请求,建立连接。
(5)分别取得服务器和客户端ServerSocket 和Socket的InputStream和OutputStream.
(6) 利用Socket和ServerSocket进行数据通信。
4、linux中的socket与windows中socket文件之间的区别。
socket作为套接字,能够对数据进行包装后进行发送,socket本质是一个文件。
Linux中是将socket文件视为普通文件,而在windows中将socket文件看成是一个网络连接来对待,因此需要调用专门针对 socket 而设计的数据传输函数。
在window操作系统中,使用native
标注的本地方法在编译时会生成一个动态链接库(.dll文件)为JAVA语言提供相应的本地服务。
int socket(itn domain, int type, int protocol); // 创建一个套接字 | |
int bind(int sockfd, const struct sockaddr *addr, socklen_t addelen);// 将套接字绑定到地址上 | |
int listen(int sockfd, int backlog); // 监听连接 | |
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);// 接收一个连接请求 |