Java-networking

提供:Dev Guides
移動先:案内検索

Java-ネットワーキング

「ネットワークプログラミング」という用語は、複数のデバイス(コンピューター)で実行されるプログラムを作成することを指し、デバイスはすべてネットワークを使用して互いに接続されています。

J2SE APIのjava.netパッケージには、低レベルの通信の詳細を提供するクラスとインターフェースのコレクションが含まれており、問題の解決に焦点を当てたプログラムを作成できます。

java.netパッケージは、2つの一般的なネットワークプロトコルのサポートを提供します-

  • TCP -TCPはTransmission Control Protocolの略で、2つのアプリケーション間の信頼できる通信を可能にします。 TCPは通常、TCP/IPと呼ばれるインターネットプロトコルで使用されます。
  • UDP -UDPはUser Datagram Protocolの略で、アプリケーション間でデータのパケットを送信できるコネクションレスプロトコルです。

この章では、次の2つの主題について十分に理解します。

  • ソケットプログラミング-これは、ネットワーキングで最も広く使用されている概念であり、非常に詳細に説明されています。
  • URL Processing -これについては個別に説明します。 Java言語でのリンク:/java/java_url_processing [URL処理]については、ここをクリックしてください。

ソケットプログラミング

ソケットは、TCPを使用して2台のコンピューター間の通信メカニズムを提供します。 クライアントプログラムは、通信の終わりにソケットを作成し、そのソケットをサーバーに接続しようとします。

接続が確立されると、サーバーは通信の終わりにソケットオブジェクトを作成します。 クライアントとサーバーは、ソケットへの書き込みとソケットからの読み取りによって通信できるようになりました。

java.net.Socketクラスはソケットを表し、java.net.ServerSocketクラスはサーバープログラムがクライアントをリッスンしてクライアントとの接続を確立するメカニズムを提供します。

ソケットを使用して2つのコンピューター間にTCP接続を確立する場合、次の手順が発生します-

  • サーバーはServerSocketオブジェクトをインスタンス化し、どのポート番号の通信が行われるかを示します。
  • サーバーは、ServerSocketクラスのaccept()メソッドを呼び出します。 このメソッドは、クライアントが指定されたポートでサーバーに接続するまで待機します。
  • サーバーが待機した後、クライアントは、接続するサーバー名とポート番号を指定して、Socketオブジェクトをインスタンス化します。
  • Socketクラスのコンストラクターは、指定されたサーバーとポート番号にクライアントを接続しようとします。 通信が確立された場合、クライアントにはサーバーと通信できるSocketオブジェクトがあります。
  • サーバー側では、accept()メソッドは、クライアントのソケットに接続されているサーバー上の新しいソケットへの参照を返します。

接続が確立された後、I/Oストリームを使用して通信を行うことができます。 各ソケットには、OutputStreamとInputStreamの両方があります。 クライアントのOutputStreamはサーバーのInputStreamに接続され、クライアントのInputStreamはサーバーのOutputStreamに接続されます。

TCPは双方向通信プロトコルであるため、両方のストリームで同時にデータを送信できます。 以下は、ソケットを実装するためのメソッドの完全なセットを提供する便利なクラスです。

ServerSocketクラスメソッド

*java.net.ServerSocket* クラスは、ポートを取得してクライアント要求をリッスンするためにサーバーアプリケーションによって使用されます。

ServerSocketクラスには4つのコンストラクタがあります-

Sr.No. Method & Description
1

public ServerSocket(int port) throws IOException

指定されたポートにバインドされたサーバーソケットを作成しようとします。 ポートがすでに別のアプリケーションによってバインドされている場合、例外が発生します。

2

public ServerSocket(int port, int backlog) throws IOException

前のコンストラクターと同様に、backlogパラメーターは、待機キューに格納する着信クライアントの数を指定します。

3

public ServerSocket(int port, int backlog, InetAddress address) throws IOException

前のコンストラクターと同様に、InetAddressパラメーターはバインドするローカルIPアドレスを指定します。 InetAddressは、複数のIPアドレスを持つサーバーに使用され、サーバーがクライアント要求を受け入れるIPアドレスを指定できるようにします。

4

public ServerSocket() throws IOException

非バインドサーバーソケットを作成します。 このコンストラクターを使用する場合、サーバーソケットをバインドする準備ができたらbind()メソッドを使用します。

ServerSocketコンストラクターが例外をスローしない場合は、アプリケーションが指定されたポートに正常にバインドされ、クライアント要求の準備ができていることを意味します。

以下は、ServerSocketクラスの一般的なメソッドの一部です-

Sr.No. Method & Description
1

public int getLocalPort()

サーバーソケットがリッスンしているポートを返します。 このメソッドは、コンストラクターでポート番号として0を渡して、サーバーにポートを見つけさせる場合に便利です。

2

public Socket accept() throws IOException

着信クライアントを待ちます。 このメソッドは、setSoTimeout()メソッドを使用してタイムアウト値が設定されていると仮定して、クライアントが指定されたポートでサーバーに接続するか、ソケットがタイムアウトするまでブロックします。 それ以外の場合、このメソッドは無期限にブロックします。

3

public void setSoTimeout(int timeout)

accept()中にサーバーソケットがクライアントを待機する時間のタイムアウト値を設定します。

4

public void bind(SocketAddress host, int backlog)

SocketAddressオブジェクトの指定されたサーバーとポートにソケットをバインドします。 引数なしのコンストラクタを使用してServerSocketをインスタンス化した場合は、このメソッドを使用します。

ServerSocketがaccept()を呼び出すと、クライアントが接続するまでメソッドは戻りません。 クライアントが接続すると、ServerSocketは指定されていないポートに新しいソケットを作成し、この新しいソケットへの参照を返します。 これで、クライアントとサーバーの間にTCP接続が存在し、通信を開始できます。

ソケットクラスメソッド

*java.net.Socket* クラスは、クライアントとサーバーの両方が互いに通信するために使用するソケットを表します。 クライアントはSocketオブジェクトをインスタンス化して取得しますが、サーバーはaccept()メソッドの戻り値からSocketオブジェクトを取得します。

Socketクラスには、クライアントがサーバーへの接続に使用する5つのコンストラクターがあります-

Sr.No. Method & Description
1

public Socket(String host, int port) throws UnknownHostException, IOException.

このメソッドは、指定されたポートで指定されたサーバーへの接続を試みます。 このコンストラクターが例外をスローしない場合、接続は成功し、クライアントはサーバーに接続されます。

2

public Socket(InetAddress host, int port) throws IOException

このメソッドは、ホストがInetAddressオブジェクトによって示されることを除いて、前のコンストラクターと同じです。

3

public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.

指定されたホストとポートに接続し、指定されたアドレスとポートのローカルホストにソケットを作成します。

4

public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.

このメソッドは、ホストがStringではなくInetAddressオブジェクトで示されることを除いて、前のコンストラクターと同じです。

5

public Socket()

接続されていないソケットを作成します。 connect()メソッドを使用して、このソケットをサーバーに接続します。

Socketコンストラクターが戻ると、単にSocketオブジェクトをインスタンス化するのではなく、指定されたサーバーとポートへの接続を実際に試行します。

Socketクラスに関係するいくつかのメソッドをここにリストします。 クライアントとサーバーの両方にSocketオブジェクトがあるため、これらのメソッドはクライアントとサーバーの両方から呼び出すことができます。

Sr.No. Method & Description
1

public void connect(SocketAddress host, int timeout) throws IOException

このメソッドは、指定されたホストにソケットを接続します。 このメソッドは、引数なしのコンストラクタを使用してSocketをインスタンス化する場合にのみ必要です。

2

public InetAddress getInetAddress()

このメソッドは、このソケットが接続されている他のコンピューターのアドレスを返します。

3

public int getPort()

リモートマシンでソケットがバインドされているポートを返します。

4

public int getLocalPort()

ソケットがローカルマシンでバインドされているポートを返します。

5

public SocketAddress getRemoteSocketAddress()

リモートソケットのアドレスを返します。

6

public InputStream getInputStream() throws IOException

ソケットの入力ストリームを返します。 入力ストリームは、リモートソケットの出力ストリームに接続されます。

7

public OutputStream getOutputStream() throws IOException

ソケットの出力ストリームを返します。 出力ストリームは、リモートソケットの入力ストリームに接続されます。

8

public void close() throws IOException

ソケットを閉じます。これにより、このSocketオブジェクトはサーバーに再接続できなくなります。

InetAddressクラスメソッド

このクラスは、インターネットプロトコル(IP)アドレスを表します。 以下は、ソケットプログラミングを行う際に必要となる便利なメソッドです。

Sr.No. Method & Description
1

static InetAddress getByAddress(byte[] addr)

生のIPアドレスを指定してInetAddressオブジェクトを返します。

2

static InetAddress getByAddress(String host, byte[] addr)

指定されたホスト名とIPアドレスに基づいてInetAddressを作成します。

3

static InetAddress getByName(String host)

ホスト名を指定して、ホストのIPアドレスを決定します。

4

String getHostAddress()

テキスト表示のIPアドレス文字列を返します。

5

String getHostName()

このIPアドレスのホスト名を取得します。

6

static InetAddress InetAddress getLocalHost()

ローカルホストを返します。

7

String toString()

このIPアドレスを文字列に変換します。

ソケットクライアントの例

次のGreetingClientは、ソケットを使用してサーバーに接続し、グリーティングを送信し、応答を待つクライアントプログラムです。

//File Name 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プログラムは、コマンドライン引数で指定されたポート番号でクライアントをリッスンするためにソケットクラスを使用するサーバーアプリケーションの例です-

//File Name 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 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!