English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Javaのフロー制御

Javaの配列

Javaのオブジェクト指向(I)

Javaのオブジェクト指向(II)

Javaのオブジェクト指向(III)

Java 異常処理

Java List(リスト)

Java Queue(キュー)

Java Mapコレクション

Java Setコレクション

Javaの入出力(I/O)

Java Reader/Writer

Javaの他のトピック

Java ネットワークプログラミング

ネットワークプログラミングとは、複数のデバイス(コンピュータ)上で実行されるプログラムを書くことを指します。これらのデバイスはネットワーク接続を通じて接続されています。

java.netパッケージのJ2SEのAPIパッケージには、低レベルの通信詳細を提供するクラスとインターフェースが含まれています。これらのクラスとインターフェースを使用して、通信詳細に注意を払わずに問題解決に集中することができます。

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

  • TCP:TCP(英語:Transmission Control Protocol、伝送制御プロトコル)は、接続指向の、信頼性の高い、バイトストリームベースのトランスポートレベル通信プロトコルです。TCPレベルはIPレベルの上、アプリケーションレベルの下に位置する中間レベルです。TCPは2つのアプリケーション間の信頼性の高い通信を保証します。通常、インターネットプロトコル(TCP)として使用されます。 / IP。

  • UDP:UDP(英語:User Datagram Protocol、ユーザーデータグラムプロトコル)は、OSIモデルのトランスポートレベルに位置する無接続のプロトコルです。アプリケーション間で送信するデータグラムを提供します。UDPは信頼性に欠けるとともに無接続プロトコルであるため、アプリケーションは通常、データパックの一部の損失、エラー、または重複を許容する必要があります。

このチュートリアルでは以下の2つの主題を中心に説明します。

  • Socketプログラミング:これは最も広く使用されているネットワーク概念であり、非常に詳細に説明されています。

  • URL処理:これは別の章で説明します。ここをクリックして、URL処理についてさらに詳しく学んでください。 Java言語のURL処理

Socketプログラミング

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

接続が確立されたとき、サーバーはSocketオブジェクトを作成します。クライアントとサーバーは、Socketオブジェクトに対して書き込みと読み取りを行って通信を行うことができます。

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

以下のステップが、2台のコンピュータ間でソケットを使用してTCP接続を確立する際に発生します:

  • サーバーはServerSocketオブジェクトをインスタンス化し、サーバー上のポートを通じて通信を表示します。

  • サーバーはServerSocketクラスのaccept()メソッドを呼び出し、そのメソッドはクライアントが指定されたポートに接続するまで待機します。

  • サーバーが待機している間に、クライアントはSocketオブジェクトをインスタンス化し、サーバー名とポート番号を指定して接続を要求します。

  • Socketクラスのコンストラクタは、指定されたサーバーとポートにクライアントを接続しようと試みます。通信が確立された場合、クライアント側にSocketオブジェクトが作成され、サーバーと通信できます。

  • サーバーサイドでは、accept()メソッドが新しいソケットリファレンスを返し、そのソケットはクライアントのソケットに接続されます。

接続が確立された後、Iを使用して/通信中にOストリームを使用すると、各ソケットには出力ストリームと入力ストリームがあります。クライアントの出力ストリームはサーバーサイドの入力ストリームに接続され、クライアントの入力ストリームはサーバーサイドの出力ストリームに接続されます。

TCPは双方向の通信プロトコルであり、したがってデータは同時に2つのデータストリームを通じて送信できます。以下は、ソケットを実現するための有用なメソッドのセットを提供するクラスの一例です。

ServerSocketクラスのメソッド

サーバーアプリケーションはjava.net.ServerSocketクラスを使用してポートを取得し、クライアントからのリクエストをリスンします。

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

番号メソッド説明
1public ServerSocket(int port) throws IOException
特定のポートにバインドするサーバーソケットを作成します。
2public ServerSocket(int port, int backlog) throws IOException
指定のバックログを使用してサーバーソケットを作成し、指定のローカルポートにバインドします。
3public ServerSocket(int port, int backlog, InetAddress address) throws IOException
指定のポート、リスニングバックログ、およびバインドするローカルIPアドレスを使用してサーバーを作成します。
4public ServerSocket() throws IOException
バインドされていないサーバーソケットを生成します。

バインドされていないサーバーソケットを生成します。ServerSocket 构造メソッドが例外をスローしない場合、アプリケーションは指定されたポートに成功してバインドし、クライアントのリクエストを監視しています。

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

番号メソッド説明
1public int getLocalPort()
  このソケットが監視しているポート番号を返します。
2public Socket accept() throws IOException
このソケットに接続を受け入れるために監視します。
3public void setSoTimeout(int timeout)
 指定されたタイムアウト値で有効にします/SO_TIMEOUT を無効にします(ミリ秒単位)。
4public void bind(SocketAddress host, int backlog)
ServerSocket を特定のアドレス(IP アドレスとポート番号)にバインドします。

Socket クラスのメソッド

java.net.Socket クラスは、クライアントとサーバーが相互に通信するために使用されるソケットを表します。クライアントは、例示することで Socket オブジェクトを取得し、サーバーは accept() メソッドの返値で Socket オブジェクトを取得します。

Socket クラスには 5 つの構造メソッドがあります。

番号メソッド説明
1public Socket(String host, int port) throws UnknownHostException, IOException.
指定されたホスト上の指定されたポート番号に接続するストリームソケットを生成します。
2public Socket(InetAddress host, int port) throws IOException
指定された IP アドレスの指定されたポート番号に接続するストリームソケットを生成します。
3public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
指定のリモートホスト上の指定されたリモートポートに接続するソケットを生成します。
4public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
指定されたリモートアドレス上の指定されたリモートポートに接続されるソケットを作成します。
5public Socket()
システムデフォルトのタイプの SocketImpl を使用して未接続のソケットを作成します

Socket 构造メソッドが返され、実際には指定されたサーバーとポートに接続しようと試みる前の例です。

以下に興味深いメソッドを一覧表示します。クライアントとサーバー両方にソケットオブジェクトがありますので、クライアントでもサーバーでもこれらのメソッドを呼び出すことができます。

番号メソッド説明
1public void connect(SocketAddress host, int timeout) throws IOException
このソケットをサーバーに接続し、タイムアウト値を指定します。
2public InetAddress getInetAddress()
 ソケットが接続されているアドレスを返します。
3public int getPort()
このソケットが接続されているリモートポートを返します。
4public int getLocalPort()
このソケットがバインドされているローカルポートを返します。
5public SocketAddress getRemoteSocketAddress()
ソケットが接続されていない場合、null を返します。
6public InputStream getInputStream() throws IOException
このソケットの入力ストリームを返します。
7public OutputStream getOutputStream() throws IOException
このソケットのオプションストリームを返します。
8public void close() throws IOException
このソケットを閉じます。

InetAddress クラスのメソッド

このクラスはインターネットプロトコル(IP)アドレスを表します。ソケットプログラミングで便利なメソッドは以下の通りです:

番号メソッド説明
1static InetAddress getByAddress(byte[] addr)
指定されたオリジナル IP アドレスの情况下、InetAddress オブジェクトを返します。
2static InetAddress getByAddress(String host, byte[] addr)
提供されたホスト名と IP アドレスに基づいて InetAddress を作成します。
3static InetAddress getByName(String host)
指定されたホスト名の IP アドレスを決定します。
4String getHostAddress() 
IP アドレスの文字列表現(テキスト形式)を返します。
5String getHostName() 
 この IP アドレスのホスト名を取得します。
6static InetAddress getLocalHost()
ローカルホストを返します。
7String 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("ホストに接続:" + serverName + "、ポート番号:" + port);
         Socket client = new Socket(serverName, port);
         System.out.println("远程主机地址:" + 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("サーバー応答: " + in.readUTF());
         client.close();
      catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

Socket サーバーサンプル

以下の 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("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            System.out.println("远程主机地址:" + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("谢谢连接我:" + 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.run();
      catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

上記の2つのjavaファイルをコンパイルし、以下のコマンドを実行してサービスを起動します、ポート番号を使用します 6066:

$ javac GreetingServer.java 
$ java GreetingServer 6066
リモート接続を待機中、ポート番号が:6066...

新しいコマンドウィンドウを開き、以下のコマンドを実行してクライアントを開始します:

$ javac GreetingClient.java 
$ java GreetingClient localhost 6066
ホストに接続:localhost 、ポート番号:6066
リモートホストアドレス:localhost/127.0.0.1:6066
サーバー応答: ありがとうございます、接続を受け付けました:/127.0.0.1:6066
さようなら!