Javaネットワークプログラミングsocketプログラミングなどの詳細

8192 ワード

ネットワークプログラミングとは、ネットワークを介して接続された複数のデバイス(コンピュータ)で実行されるプログラムを記述することである.
java.NetパッケージのJ 2 SEのAPIには、低レベルの通信詳細を提供するクラスとインタフェースが含まれています.これらのクラスとインタフェースを直接使用して、通信の詳細に注目することなく、問題の解決に専念することができます.
java.Netパッケージには、2つの一般的なネットワークプロトコルのサポートがあります.
TCP:TCPは、2つのアプリケーション間の信頼性の高い通信を保証する伝送制御プロトコルの略です.一般的にインターネットプロトコルに用いられ、TCP/IPと呼ばれる.
UDP:UDPは、ユーザー・データ・レポート・プロトコルの略で、接続されていないプロトコルです.アプリケーション間で送信するデータを提供するパケット.このチュートリアルでは、以下の2つのトピックについて説明します.
Socketプログラミング:これは最も広範なネットワーク概念を使用しており、非常に詳細に説明されています.
URL処理:この部分は別の紙面で話しますが、Java言語でのURL処理についてはここをクリックしてもっと詳しく知ります.
Socketプログラミング
ソケットワードはTCPを用いて2台のコンピュータ間の通信メカニズムを提供する.クライアント・プログラムはソケットを作成し、サーバに接続しようとします.
接続が確立されると、サーバはSocketオブジェクトを作成します.クライアントとサーバは、Socketオブジェクトの書き込みと読み取りによって通信できるようになりました.
java.net.Socketクラスはソケットを表しjava.net.ServerSocketクラスは、サーバ・プログラムがクライアントをリスニングし、接続を確立するメカニズムを提供します.
次の手順は、2台のコンピュータ間でソケットを使用してTCP接続を確立するときに発生します.
サーバは、サーバ上のポートを介して通信することを示すサーバSocketオブジェクトをインスタンス化します.
サーバは、クライアントがサーバ上の指定されたポートに接続されるまで待機するサーバソケットクラスのaccept()メソッドを呼び出します.
サーバが待機している間、クライアントはSocketオブジェクトをインスタンス化し、サーバ名とポート番号を指定して接続を要求します.
Socketクラスのコンストラクション関数は、クライアントを指定したサーバとポート番号に接続しようとします.通信が確立されると、クライアントにSocketオブジェクトを作成してサーバと通信することができます.
サーバ側では、accept()メソッドは、クライアントのsocketに接続されたサーバ上の新しいsocket参照を返します.
接続が確立されると、I/Oストリームを使用して通信が行われます.各socketには出力ストリームと入力ストリームがあります.クライアントの出力ストリームはサーバ側の入力ストリームに接続され、クライアントの入力ストリームはサーバ側の出力ストリームに接続される.
TCPは双方向の通信プロトコルであるため、2つのデータストリームを介して同じ時間にデータを送信することができる.以下に、いくつかのクラスが提供するsocketsを実現するための完全な有用な方法を示します.
ServerSocketクラスのメソッド
サーバアプリケーションはjavaを使用する.net.ServerSocketクラスは、ポートを取得し、クライアント要求をリスニングします.
ServerSocketクラスには、次の4つの構築方法があります.
シーケンス番号
メソッドの説明
1
public Server Socket(int port)throws IOException特定のポートにバインドされたサーバソケットの作成
2
public Server Socket(int port,int backlog)throws IOException指定したbacklogを使用してサーバーソケットを作成し、指定したローカルポート番号にバインド
3
public Server Socket(int port,int backlog,InetAddress address)throws IOException指定したポート、リスニングbacklog、およびバインドするローカルIPアドレスを使用してサーバを作成
4
public Server Socket()throws IOExceptionバインドされていないサーバソケットの作成
バインドされていないサーバソケットを作成します.サーバソケットの構築方法に異常がない場合は、アプリケーションが指定したポートにバインドされ、クライアントリクエストがリスニングされたことを意味します.
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)サーバSocketを特定のアドレス(IPアドレスとポート番号)にバインドする
Socketクラスのメソッド
java.net.Socketクラスは、クライアントとサーバが互いにコミュニケーションするためのソケットを表します.クライアントがSocketオブジェクトを取得するにはインスタンス化し、サーバがSocketオブジェクトを取得するにはaccept()メソッドの戻り値を取得します.
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コンストラクションメソッドが返されると、単純にSocketオブジェクトがインスタンス化されず、実際には指定したサーバとポートに接続しようとします.
以下に、クライアント側とサーバ側に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このソケットを閉じます
InetAddressクラスのメソッド
このクラスはインターネットプロトコル(IP)アドレスを表す.以下に、Socketプログラミングで役立つ方法を示します.
シーケンス番号
メソッドの説明
1
static InetAddress getByAddress(byte[]address)元の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に変換
Socketクライアントインスタンス
次のGreetingClientは、socketを介してサーバに接続され、リクエストを送信し、応答を待つクライアントプログラムです.

//     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();
  }
 }
}

Socketサービス・エンドの例
次のGreetingServerプログラムは、Socketを使用して指定したポートをリスニングするサーバ側アプリケーションです.

//     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() + "
Goodbye!"); 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!

この文章があなたの役に立つことを望みます