Javaのネットワークプログラミング
ネットワークプログラミングは、複数の装置(コンピュータ)プログラムの実行を記述することを意味し、これらのデバイスは、ネットワークを介して接続されています。
J2SE APIのjava.netパッケージには、低レベルの通信の詳細を提供するクラスとインタフェースが含まれています。 あなたが問題を解決するに焦点を当てるのではなく、通信の詳細に集中するこれらのクラスとインタフェースを使用することができます。
java.netパッケージには、2つの一般的なネットワークプロトコルをサポートしています。
- TCP:TCPは 、2つのアプリケーション間通信の信頼性を保証する伝送制御プロトコルの略です。 一般的にTCP / IPと呼ばれるインターネットプロトコルに使用されます。
- UDP:UDPはユーザデータグラムプロトコル、コネクションレスプロトコルの略です。 アプリケーションデータとの間で送信されるデータパケットを提供します。
このチュートリアルでは、次の2つのトピックについて説明します。
- ソケットプログラミング :これは、最も広く使用されるネットワークの概念であり、それを詳細に説明しました
- URL 処理 :この章では、詳細については、ここをクリックして、別の空間に話したJava言語を扱うURL 。
ソケットプログラミング
ソケットは、TCPは、2台のコンピュータ間の通信メカニズムを提供しています。 クライアントプログラムは、ソケットを作成し、サーバーソケットに接続しようとします。
接続が確立されると、サーバは、ソケットオブジェクトを作成します。 クライアントとサーバーは、書くことができると通信するSocketオブジェクトを読み取るために。
java.net.Socketクラスは、ソケットを表し、クライアントサーバプログラムをリッスンし、それらと接続するためのメカニズムを確立するためにjava.net.ServerSocketクラスを提供します。
TCP接続が2台のコンピュータ間のソケットを確立するには、次の手順を使用する場合に発生します。
- ServerSocketのサーバーは、サーバー上の通信ポートを表すオブジェクトをインスタンス化します。
- ServerSocketクラスのサーバ呼び出しは、クライアントが指定したポート上のサーバーに接続するまで待機します()メソッドを、受け入れます。
- サーバはSocketオブジェクトをインスタンス化するためのクライアントを待っているときは、接続を要求するためにサーバー名とポート番号を指定します。
- Socketクラスのコンストラクタは、指定したサーバーとポート番号にクライアントを接続しようとします。 通信が確立されている場合は、サーバーと通信することができSocketオブジェクトのクライアントを作成します。
- サーバー側では、受け入れ()メソッドは、クライアントのソケットに接続されたソケットに新しいソケットサーバの参照を返します。
TCPは、データが同時に2つのデータストリームを介して送信することができるように、双方向通信プロトコルである。以下は、完全なクラスは、ソケットを達成するために、いくつかの有用な方法を提供します。
ServerSocketクラスメソッド
ポートに対してjava.net.ServerSocketクラスを使用してサーバーアプリケーションとクライアント要求をリッスンします。
ServerSocketのクラスは4コンストラクタを持っています。
いいえ。 | メソッド説明 |
1 | 公共のServerSocket(int型ポート)はIOExceptionがスローされます サーバソケットの特定のポートへの結合を作成します。 |
2 | 公共のServerSocket(int型ポート、int型のバックログは )IOExceptionがスローされます 指定されたバックログでサーバソケットを作成し、指定されたローカルポート番号にバインドします。 |
3 | 公共のServerSocket(int型ポート、int型のバックログ 、InetAddressのアドレス)は、IOExceptionがスローされます 指定されたポートを使用して、バックログを聞いて、作成されるサーバーのローカルIPアドレスにバインドします。 |
4 | 公共のServerSocket()はIOExceptionがスローされます バインドされていないサーバソケットを作成します。 |
バインドされていないサーバソケットを作成します。 ServerSocketのコンストラクタ・メソッドが例外をスローしない場合、それはあなたのアプリケーションが正常に指定されたポートにバインドされていることを意味し、クライアントの要求をリッスンします。
ここではいくつかの一般的な方法のServerSocketのクラス次のとおりです。
いいえ。 | メソッド説明 |
1 | 公共のint getLocalPort() このソケットが待機しているポートを返します。 |
2 | 公共ソケット(受け入れる)はIOExceptionがスローされます 彼はこのソケットを待機し、受け入れます。 |
3 | ます。public void setSoTimeout(int型のタイムアウト) ミリ秒単位で、有効/ SO_TIMEOUTを無効にするには、タイムアウト値を指定すること。 |
4 | 公共ボイドバインド(のSocketAddressホスト、int型のバックログ) 特定のアドレス(IPアドレスとポート番号)にサーバーソケットをバインドします。 |
Socketクラスのメソッド
ソケットに相互に通信するために、クライアントとサーバーののjava.net.Socketクラスに代わっ。 インスタンス化およびSocketオブジェクトを取得するには、サーバーが()メソッドを受け入れる値によって返されることで、クライアントSocketオブジェクトを取得するには。
Socketクラスは、5つのコンストラクタを持っています。
いいえ。 | メソッド説明 |
1 | 公共ソケット(文字列のホスト、int型ポート )UnknownHostExceptionが、IOExceptionがスローされます。 ストリームソケットを作成し、指定されたホスト上の指定されたポート番号に接続します。 |
2 | 公共ソケット(InetAddressのホスト、int型のポートは )IOExceptionがスローされます ストリームソケットを作成し、指定されたポート番号の指定されたIPアドレスに接続します。 |
3 | 公共ソケット(文字列のホスト、int型ポート 、InetAddressのlocalAddressでは、int型localPortでは)は、IOExceptionがスローされます。 ソケットを作成し、指定されたリモートホスト上の指定されたリモートポートに接続します。 |
4 | 公共ソケット(InetAddressのホスト、int型ポート 、InetAddressのlocalAddressでは、int型localPortでは)は、IOExceptionがスローされます。 ソケットを作成し、指定されたリモートアドレスに指定されたリモートポートに接続します。 |
5 | 公共のソケット() 未接続のソケット、システムのデフォルトのタイプを作成のSocketImpl |
ソケットコンストラクタ戻り、ないが、単純にSocketオブジェクトをインスタンス化するとき、それは実際には指定されたサーバーおよびポートに接続しようとします。
ここでは、興味のあるいくつかの方法でクライアントに注意を払うと、サーバーに関係なく、クライアントの、Socketオブジェクトを持っているか、サーバーがこれらのメソッドを呼び出すことができます。
いいえ。 | メソッド説明 |
1 | 公共ボイドは接続(のSocketAddressホストは、int型のタイムアウト)はIOExceptionがスローされます このソケットサーバへの接続、およびタイムアウト値を指定します。 |
2 | 公共のInetAddress getInetAddress() ソケット接続のリターンアドレス。 |
3 | 公共int型のgetPort() 戻り値は、このソケットは、リモートポートに接続されています。 |
4 | 公共のint getLocalPort() 戻り値は、このソケットがローカルポートにバインドされています。 |
5 | 公共のSocketAddress getRemoteSocketAddress() それは未接続のリターンnullの場合、エンドポイントのリターンアドレスは、このソケットは、接続されています。 |
6 | 公共のInputStreamのgetInputStream()はIOExceptionをスローします このソケットの入力ストリームを返します。 |
7 | 公共のOutputStreamのgetOutputStream()はIOExceptionをスローします このソケットの出力ストリームを返します。 |
8 | 公共ボイド近い()はIOExceptionをスローします このソケットを閉じます。 |
InetAddressクラスメソッド
このクラスは、インターネットプロトコル(IP)アドレスを表します。 以下に示す有用なときにソケットプログラミング方法:
いいえ。 | メソッド説明 |
1 | 静的のInetAddress getByAddress(バイト[] addrに ) 生のIPアドレスを指定した場合には、InetAddressオブジェクトを返します。 |
2 | 静的のInetAddress getByAddress(文字列のホスト、バイト [] addrに) 供給InetAddressのホスト名とIPアドレスを作成する方法。 |
3 | 静的のInetAddressのgetByName(String型のホスト) 指定されたホスト名の場合のホストのIPアドレスを決定します。 |
4 | 文字列はgetHostAddress() IPアドレス文字列(テキスト表現)を返します。 |
5 | 文字列のgethostname() このIPアドレスのホスト名を取得します。 |
6 | 静的のInetAddressはgetLocalHost() ローカルホストを返します。 |
7 | 文字列のtoString() このIPアドレスをStringに変換します。 |
ソケットクライアント・インスタンス
次GreetingClientは、サーバーへのソケットを介して接続し、応答を待ち、その後、リクエストを送信されたクライアントプログラムです。
// 文件名 GreetingClient.java import java.net.*; import java.io.*; public class GreetingClient { public static void main(String [] args) { String serverName = args[0]; int port = Integer.parseInt(args[1]); try { System.out.println("Connecting to " + serverName + " on port " + port); Socket client = new Socket(serverName, port); System.out.println("Just connected to " + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Hello from " + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("Server says " + in.readUTF()); client.close(); }catch(IOException e) { e.printStackTrace(); } } }
ソケット・サーバー・インスタンス
次GreetingServerプログラムは、指定されたポートでリッスンするようにソケットを使用して、サーバー側のアプリケーションです。
// 文件名 GreetingServer.java import java.net.*; import java.io.*; public class GreetingServer extends Thread { private ServerSocket serverSocket; public GreetingServer(int port) throws IOException { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000); } public void run() { while(true) { try { System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); Socket server = serverSocket.accept(); System.out.println("Just connected to " + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() + "\nGoodbye!"); server.close(); }catch(SocketTimeoutException s) { System.out.println("Socket timed out!"); break; }catch(IOException e) { e.printStackTrace(); break; } } } public static void main(String [] args) { int port = Integer.parseInt(args[0]); try { Thread t = new GreetingServer(port); t.start(); }catch(IOException e) { e.printStackTrace(); } } }
上記のJavaコードをコンパイルし、サービスを開始するには、次のコマンドを実行し、ポート番号は6066です使用します。
$ java GreetingServer 6066 Waiting for client on port 6066...次のクライアントのようなオープンなもの:
$ java GreetingClient localhost 6066 Connecting to localhost on port 6066 Just connected to localhost/127.0.0.1:6066 Server says Thank you for connecting to /127.0.0.1:6066 Goodbye!