A、ソケット通信処理
1、ソケットとソケットプログラミングの説明:
ソケットは、契約またはコンピュータ間で通信するための方法である「ソケット」として翻訳されます。この規則ソケットにより、コンピュータが他のコンピュータからデータを受信することができ、また、他のコンピュータにデータを送信することができます。
私たちは、あなたがTCP / UDPプロトコルを使用することができますので、それは基本的なトランスポート層の上に立っている、ソケットプログラミングについて話しているが、アクセスのWebページへのHTTPプロトコルは、アプリケーション層を必要とするためのページにアクセスすることはできません。アプリケーションは、下の層の内容を実施することであるように、層の内容に達成することができません。
図2に示すように、ソケット通信処理:
(1)のServerSocketおよびSocketを作成します。
(2)入力/出力ストリームへのオープンソケット接続
(3)ソケット読み取り/書き込み動作のプロトコルに従って
(4)入力および出力ストリームを閉じ、閉じるソケット
2、ソケットのソケットファイルでLinuxとWindowsの違い。
ソケットのソケットとして、包装することができるデータを送信した後、実質的にソケットファイルです。
Linuxは通常のファイルとしてソケットファイルで、ファイルには、ソケットのために特別に設計されたデータ送信機能を呼び出す必要があるので、に対処するためのネットワーク接続でソケットウィンドウで見られます。
第二に、Javaのソケットプログラミングに基づいて
クライアントとサーバーの使用次のコードに示すコンソールを使用します。Javaベースのソケットは、インタフェースの使用を結合した後、結合界面、およびクライアントのための方法を受け入れる聞いた後、バインドのServerSocketクラスへのサーバのニーズに合わせて、送信データをJavaのメインソケットとServerSocketAPIを呼び出すために練習をプログラミングします。
1、クライアントの通信プロセス
(1)サーバのアドレスとポート番号に接続する必要があることを示すソケット・オブジェクトを作成します
(2)接続が確立され、サーバによって出力ストリームは次のように要求メッセージを送信します
(3)によって、入力ストリームに応答して情報サーバを得ます
(4)応答リソースを閉じます
java.io.IOExceptionのインポート、 インポートてjava.io.PrintWriter; インポートjava.net.InetAddress; インポートのjava.net.Socket; インポートjava.net.UnknownHostExceptionを発行; インポートjava.util.Scanner; パブリッククラスクライアント{ 公共静的ボイドtestClient (){ System.out.printlnは( "サーバへの要求が接続されている..."); ソケットソケット= NULL; スキャナkeybordscanner = NULL; スキャナinScanner = NULL; のPrintWriter pwtoserver = NULL; 試み{ のInetAddressを使用して//クラスプログラミングソケットのすべてに接続されます 。ソケットソケット新新=(のInetAddress.getLocalHost()、6668) inScanner =新しい新しいスキャナ(Socket.getInputStream()); System.out.println(inScanner.nextLine()); pwtoserver =新しい新しいPrintWriter(Socket.getOutputStream()); System.out.print( "I(クライアント):"); keybordscanner =新しい新しいスキャナ(System.in) ; しばらく(keybordscanner.hasNextLine()){ 文字列keyborddata = keybordscanner.nextLine(); メッセージは、クライアント//によって送られた のSystem.out.println( "I(クライアント):" + keyborddata); //書き込みサーバにコンソール pwtoserver.println(keyborddata); pwtoserver.flush(); ブロッキングメッセージサーバ受信するための//待ち 列inDataの大きinScanner.nextLineを=(); のSystem.out.println( "サーバ" + INDATA)。 System.out.print( "我(客户端):"); } }キャッチ(UnknownHostExceptionが電子){ // TODO自動生成されたcatchブロック e.printStackTrace(); }キャッチ(IOExceptionを電子){ // TODO自動生成されたcatchブロック e.printStackTrace(); }最後に{ keybordscanner.close()。 pwtoserver.close(); inScanner.close(); {試みる )(socket.close。 }キャッチ(IOExceptionを電子){ // TODO自動生成されたcatchブロック e.printStackTrace(); } } } パブリック静的無効メイン(文字列[] args){ testClient()。 } }
2、サーバー:
(1)は、ServerSocketオブジェクトとバインドリスニングポートを作成します。
(2)受け入れ()メソッドは、クライアントの要求をリッスン
(3)接続が確立され、クライアントは、入力ストリームを介してリード要求情報を送信します
(4)は、出力フローアクセントクライアントを介して情報を送信します
(5)に近い関連リソース
java.io.IOExceptionのインポート、 インポートてjava.io.PrintWriter; インポートjava.net.ServerSocket; インポートのjava.net.Socket; インポートjava.util.Scanner; パブリッククラスサーバー{ //サーバー のパブリック静的な無効れ、testServer(){ / /サーバーを作成 するSystem.out.println( "クライアントからの接続要求..."); PrintWriterのpwtoclien = NULL; スキャナkeybordscanner = NULL; スキャナinScanner = NULL; ServerSocketをSS = NULL; 試み{ SS =新しい新しいServerSocketを(6667) ; //は、受信クライアント接続オブジェクトを作成する ソケットのソケット= ss.accept(); System.out.printlnは(socket.getInetAddress()+「正常にこのサーバーに接続されていました。」); //文字出力ストリーム pwtoclien =新しい新しいPrintWriter(Socket.getOutputStream()); pwtoclien.println( "!が正常にリモートサーバに接続されていた" + "\トン" + "は最初に話してください。"); Pwtoclien.flush() ; keybordscanner =新しい新しいスキャナ(System.in); inScanner =新しい新しいスキャナ(Socket.getInputStream()); //上のクライアントを待っているメッセージブロック送信 しながら(inScanner.hasNextLine()){ 文字列inDataの大きinScanner.nextLineを=(); System.out.println( "クライアント:" + inDataの大きさ); System.out.print( "I(サーバー):"); 文字列keyborddata = keybordscanner.nextLine(); System.out.printlnは(「I(サービス側):「+ keyborddata); pwtoclien。println(keyborddata)。 pwtoclien.flush(); } socket.shutdownInput()。 socket.shutdownOutput(); }キャッチ(IOExceptionを電子){ // TODO自動生成されたcatchブロック e.printStackTrace(); }最後に{ pwtoclien.close()。 keybordscanner.close(); inScanner.close(); {試みる ss.closeを(); }キャッチ(IOExceptionを電子){ // TODO自動生成されたcatchブロック e.printStackTrace(); } } } パブリック静的無効メイン(文字列[] args){ テストサーバー(); } }
ここでは、シングルスレッドのコミュニケーションです。注文および制御通信に遮断するprintWriter.flushの方法を使用しています:サーバーがメッセージに返信するメッセージを送信するクライアント後にファイルを送信する際に、クライアント、どちらの形式に対応するために、クライアントにする場合にのみ、サーバ再びメッセージを送信デッドロック、デッドロックは、ファイルのみを送信した後に持ち上げることができます。
コンソール・アプリケーション・サーバー取得した送信のInetAddressクラスアドレスファイルを使用して、示されているよう。また、両方のクラスでのプログラミングプロセスは、前者を書き込むために使用され、読むのに使用され、GetInputSream GETOUTPUTSTREAMで混乱しやすいです。
クライアント:ディスプレイコンソールに示すように、クライアント。
LinuxでのJavaのサーバ機能の呼び出しを観察するために、
straceのコマンドは、呼び出しを追跡するために使用されます
三、Linuxのネットワークインターフェイスの概要
Linuxでの接続を確立するには
参照レベルのシステムに近い立ち、通信2台のマシン間で、単にTCP / UDPトランスポート層を介してIPネットワーク層、従って本質的にソケットインタフェース(API)プログラミングへのTCP / UDP / IPにTCP / UDP / IPにも使用されるWeb開発を行うためのプログラマのためのインタフェースを提供し、包装が、これはソケット・プログラミング・インタフェースです。
ソケットの作成:
INTソケット(INTドメイン、int型、int型のプロトコル)。
ソケットサーバーを作成します。
INT server_sockfd =ソケット(AF_INET、SOCK_STREAM、0);
我々はすでに知っているソケットアドレス構造体を作成した、次のステップは、ソケットを関連付けることであるとアドレスが関連付けられている方法は、bind関数を介して行われます。
int型のバインド(int型数sockfd、constの構造体のsockaddr * addrは、socklen_tをLEN)。
我们的socket已经创建出来了,当我们不再使用的时候,我们可以调用close函数来将其关闭,释放该文件描述符,这样便可以得到重新的使用。
套接字通信是双向的,但是,我们可以采用shutdown函数来禁止一个套接字的I/O
进行连接 #include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr, socklen_t len); 关闭连接 int shutdown(int sockfd, int how);