English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
ネットワークプログラミングとは、複数のデバイス(コンピュータ)上で実行されるプログラムを書くことを指します。これらのデバイスはネットワーク接続を通じて接続されています。
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処理
ソケットはTCPを使用して、2台のコンピュータ間の通信メカニズムを提供します。クライアントプログラムはソケットを作成し、サーバーのソケットに接続を試みます。
接続が確立されたとき、サーバーはSocketオブジェクトを作成します。クライアントとサーバーは、Socketオブジェクトに対して書き込みと読み取りを行って通信を行うことができます。
java.net.Socketクラスはソケットを表し、java.net.ServerSocketクラスはサーバープログラムにクライアントをリスンし、彼らと接続するメカニズムを提供します。
以下のステップが、2台のコンピュータ間でソケットを使用してTCP接続を確立する際に発生します:
サーバーはServerSocketオブジェクトをインスタンス化し、サーバー上のポートを通じて通信を表示します。
サーバーはServerSocketクラスのaccept()メソッドを呼び出し、そのメソッドはクライアントが指定されたポートに接続するまで待機します。
サーバーが待機している間に、クライアントはSocketオブジェクトをインスタンス化し、サーバー名とポート番号を指定して接続を要求します。
Socketクラスのコンストラクタは、指定されたサーバーとポートにクライアントを接続しようと試みます。通信が確立された場合、クライアント側にSocketオブジェクトが作成され、サーバーと通信できます。
サーバーサイドでは、accept()メソッドが新しいソケットリファレンスを返し、そのソケットはクライアントのソケットに接続されます。
接続が確立された後、Iを使用して/通信中にOストリームを使用すると、各ソケットには出力ストリームと入力ストリームがあります。クライアントの出力ストリームはサーバーサイドの入力ストリームに接続され、クライアントの入力ストリームはサーバーサイドの出力ストリームに接続されます。
TCPは双方向の通信プロトコルであり、したがってデータは同時に2つのデータストリームを通じて送信できます。以下は、ソケットを実現するための有用なメソッドのセットを提供するクラスの一例です。
サーバーアプリケーションはjava.net.ServerSocketクラスを使用してポートを取得し、クライアントからのリクエストをリスンします。
ServerSocketクラスには4つのコンストラクタがあります:
番号 | メソッド説明 |
1 | public ServerSocket(int port) throws IOException 特定のポートにバインドするサーバーソケットを作成します。 |
2 | public ServerSocket(int port, int backlog) throws IOException 指定のバックログを使用してサーバーソケットを作成し、指定のローカルポートにバインドします。 |
3 | public ServerSocket(int port, int backlog, InetAddress address) throws IOException 指定のポート、リスニングバックログ、およびバインドするローカルIPアドレスを使用してサーバーを作成します。 |
4 | public ServerSocket() throws IOException バインドされていないサーバーソケットを生成します。 |
バインドされていないサーバーソケットを生成します。ServerSocket 构造メソッドが例外をスローしない場合、アプリケーションは指定されたポートに成功してバインドし、クライアントのリクエストを監視しています。
以下は ServerSocket クラスの一般的なメソッドです:
番号 | メソッド説明 |
1 | public int getLocalPort() このソケットが監視しているポート番号を返します。 |
2 | public Socket accept() throws IOException このソケットに接続を受け入れるために監視します。 |
3 | public void setSoTimeout(int timeout) 指定されたタイムアウト値で有効にします/SO_TIMEOUT を無効にします(ミリ秒単位)。 |
4 | public void bind(SocketAddress host, int backlog) ServerSocket を特定のアドレス(IP アドレスとポート番号)にバインドします。 |
java.net.Socket クラスは、クライアントとサーバーが相互に通信するために使用されるソケットを表します。クライアントは、例示することで Socket オブジェクトを取得し、サーバーは accept() メソッドの返値で Socket オブジェクトを取得します。
Socket クラスには 5 つの構造メソッドがあります。
番号 | メソッド説明 |
1 | public Socket(String host, int port) throws UnknownHostException, IOException. 指定されたホスト上の指定されたポート番号に接続するストリームソケットを生成します。 |
2 | public Socket(InetAddress host, int port) throws IOException 指定された IP アドレスの指定されたポート番号に接続するストリームソケットを生成します。 |
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. 指定されたリモートアドレス上の指定されたリモートポートに接続されるソケットを作成します。 |
5 | public Socket() システムデフォルトのタイプの SocketImpl を使用して未接続のソケットを作成します |
Socket 构造メソッドが返され、実際には指定されたサーバーとポートに接続しようと試みる前の例です。
以下に興味深いメソッドを一覧表示します。クライアントとサーバー両方にソケットオブジェクトがありますので、クライアントでもサーバーでもこれらのメソッドを呼び出すことができます。
番号 | メソッド説明 |
1 | public void connect(SocketAddress host, int timeout) throws IOException このソケットをサーバーに接続し、タイムアウト値を指定します。 |
2 | public InetAddress getInetAddress() ソケットが接続されているアドレスを返します。 |
3 | public int getPort() このソケットが接続されているリモートポートを返します。 |
4 | public int getLocalPort() このソケットがバインドされているローカルポートを返します。 |
5 | public SocketAddress getRemoteSocketAddress() ソケットが接続されていない場合、null を返します。 |
6 | public InputStream getInputStream() throws IOException このソケットの入力ストリームを返します。 |
7 | public OutputStream getOutputStream() throws IOException このソケットのオプションストリームを返します。 |
8 | public void close() throws IOException このソケットを閉じます。 |
このクラスはインターネットプロトコル(IP)アドレスを表します。ソケットプログラミングで便利なメソッドは以下の通りです:
番号 | メソッド説明 |
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 getLocalHost() ローカルホストを返します。 |
7 | String 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(); } } }
以下の 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 さようなら!