ホームページ  >  記事  >  Java  >  ネットワークプログラミングソケットの詳しい説明

ネットワークプログラミングソケットの詳しい説明

Y2J
Y2Jオリジナル
2017-05-08 14:04:481271ブラウズ

この記事では、主に Java ネットワーク プログラミングのクラス メソッドと例を紹介します。必要な友人は参照してください。

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

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

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

TCP: TCP は、Transmission Control Protocol の略称で、2 つのアプリケーション間の信頼性の高い通信を保証します。 TCP/IP として知られるインターネット プロトコルに一般的に使用されます。

UDP:UDPはUser Datagram Protocolの略で、コネクションレス型プロトコルです。アプリケーション間で送信されるデータのパケットを提供します。
このチュートリアルでは主に次の 2 つのトピックについて説明します。

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

URL 処理:この部分は別のスペースで説明されます。Java でさらに詳しく知るにはここをクリックしてください言語での URL 処理。

ソケット プログラミング

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

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

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

2 台のコンピューター間でソケットを使用して TCP 接続を確立する場合、次の手順が実行されます:

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

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

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

Socket クラスの コンストラクター は、クライアントを指定されたサーバーとポート番号に接続しようとします。通信が確立されると、サーバーと通信するための Socket オブジェクトがクライアント上に作成されます。

サーバー側では、accept() メソッドは、クライアントのソケットに接続されているサーバー上の新しいソケット reference を返します。

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

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

ServerSocket クラスのメソッド

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

ServerSocket クラスには 4 つの構築メソッドがあります:

シリアル番号 メソッドの説明
1

public ServerSocket(int port) throws IOException

Create特定のポート上のサーバーソケットにバインドします

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 クラスの一般的なメソッドをいくつか示します。

number メソッドの説明
1

public int Port()

はこのソケットを返しますリッスンするポート

2

public Socket accept() throws IOException

このソケットへの接続をリッスンして受け入れる

3

public void setSoTimeout(int timeout )

有効にする/タイムアウト値をミリ秒単位で指定して SO_TIMEOUT を無効にします

4

public void binding(SocketAddress host, int backlog)

ServerSocket を特定のアドレス (IP アドレスとポート番号) にバインドします

Socket クラスのメソッド

java.net.Socket クラスは、クライアントとサーバーの両方が相互に通信するために使用するソケットを表します。クライアントはインスタンス化を通じて Socket オブジェクトを取得し、サーバーは accept() メソッドの戻り値を通じて Socket オブジェクトを取得します。 Socket クラスには 5 つの構築メソッドがあります。port) は UnknownHostException、IOException をスローします。

ストリーム ソケットを作成し、指定されたホストの指定されたポート番号に接続します。 ) IOExceptionをスローします

ストリームソケットを作成して接続します指定されたIPアドレスの指定されたポート番号に接続します

3ソケットを作成し、リモートホスト上の指定されたリモートポートに接続します4public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException5public Socket()

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

いくつかの興味深いメソッドを以下にリストします。クライアントとサーバーの両方が Socket オブジェクトを持っているため、クライアントとサーバーの両方がこれらのメソッドを呼び出すことができることに注意してください。

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

Createsソケットを作成し、指定されたリモートアドレスに接続します リモートポートを指定します

システムのデフォルトタイプ SocketImpl を通じて未接続のソケットを作成します

2345678
シリアル番号 メソッドの説明
1

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

このソケットをサーバーに接続し、タイムアウト値

public InetAddress getInetAddress()

ソケット接続のアドレスを返します

public int getPort()

このソケットが接続されているリモートポートを返します

public int getLocalPort()

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

public SocketAddress getRemoteSocketAddress()

接続されているこのソケットを返します エンドポイントのアドレス、または接続されていない場合は null


public InputStream getInputStream() throws IOException

このソケットの入力ストリームを返します

public OutputStream getOutputStream () throws IOException

を返しますこのソケットの出力ストリーム

public void close() throws IOException

このソケットを閉じる

InetAddressクラスのメソッド

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


元の IP アドレスが指定されている場合は、InetAddress オブジェクトを返します

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

ソケットクライアントインスタンス

以下の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!

【関連する推奨事項】

1. Java 無料ビデオチュートリアル

2.Java で均等な比率の画像サムネイルを実装するためのビデオチュートリアル

3.Alibaba Java 開発マニュアル

2 提供されたホスト名と IP アドレスに基づいて InetAddress を作成します
3

static InetAddress getByName(String host)

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

String getHostAddress()

IP アドレス

文字列

(テキスト表現として)


String getHostName()

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

6

static InetAddress getLocalHost()

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

String toString()

このIPアドレスをStringに変換します

以上がネットワークプログラミングソケットの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。