Javaネットワークプログラミングの簡単なサービス側クライアント応用例

6389 ワード

この例では、Javaネットワークプログラミングの簡単なサービス側クライアントアプリケーションについて説明します.皆さんの参考にしてください.具体的には以下の通りです.
Javaでは、java.net.Socketとその関連クラスを使用して、ネットワークに関する機能を完了します.Socketクラスは、Javaテクノロジーがネットワーク接続を確立し、接続を通じてデータを送信する複雑なプロセスを隠しているため、非常に簡単です.以下に述べる内容は、TCPプロトコルにのみ適用される.
一、サーバーに接続する
Socketクラスのコンストラクション関数を使用して、ソケットを開くことができます.

Socket sk = new Socket("210.0.235.14",13);

ここで、210.0.235.14は、宛先ホストのIPアドレス(またはホスト名)を表す10進数のStringオブジェクトであり、13は、宛先ホストを接続する13ポートを指定する.ここの210.0.235.14は香港にある時間割サーバで、時間割サーバのデフォルトのポートは一般的に13.サーバに正常に接続する前にプログラムがブロックされることに注意してください.次に、SocketクラスのgetInputStream()メソッドを使用して、ターゲットホストから送信された情報を取得できます.

InputStream inStream = sk.getInputStream();

同様に、ターゲットホストにデータを送信するには、getoutputStream()メソッドを呼び出して出力ストリームオブジェクトを取得できます.次の例の機能は、時間指定サーバに接続し、返された情報を標準出力に印刷することです.

try 
{ 
Socket sk = new Socket("210.0.235.14",13); 
sk.setSoTimeout(3000); 
  InputStream inStream = sk.getInputStream();
  //        
  Scanner sc = new Scanner(inStream); 
  //          
  while(sc.hasNextLine()) 
  { 
 String str = sc.nextLine(); 
 System.out.println("Output : " + str); 
  } 
  sk.close(); 
} 
catch(SocketTimeoutException e) //    
{ 
  System.out.println("Time Out!"); 
} 
catch(Exception e) 
{ 
  e.printStackTrace(); 
}

コード内のsetSoTimeout()メソッドでは、設定時間を超えても読み書きが完了していない場合にSocketTimeoutExceptionが投げ出され、この例外をキャプチャして接続を閉じるタイムアウト時間を設定できます.もう一つのタイムアウト問題はこのSocketクラスの構造関数です

new Socket(host,port);

ターゲットホストへの接続が正常に確立されるまで、無限にブロックされます.これはもちろん私たちが望んでいるものではありません.この問題は、次の呼び出しで解決できます.

Socket sk = new Socker();
sk.connect(new InetSocketAddress(host,port),2000);
//       2 

二、ホストアドレスの取得
InetAddressクラスの静的メソッドgetByName(hostname)は、あるホストアドレスを表すInetAddressオブジェクトを返すことができ、このオブジェクトは4バイトのシーケンス、すなわちホストのIPアドレスを閉じている.次にgetHostAddress()メソッドを呼び出すIPアドレスを表すStringオブジェクトを返す.
アクセスの多いホスト名の中には、通常、負荷分散を実現するために複数のIPアドレスに対応します.すべてのホストアドレスを取得するためにgetAllByName()メソッドを呼び出します.このメソッドはInetAddressオブジェクトの配列を返します.
コマンドラインにパラメータを設定しなければ、ローカルのIPアドレスを印刷し、ホスト名を指定すれば、そのホストのすべてのIPアドレスを印刷する簡単なプログラムです.

package cls; 
import java.net.*; 
public class ShowIP 
{ 
  public static void main(String[] args) 
  { 
    try 
    { 
      if(args.length > 0) 
      { 
        String hostName = args[0]; //    
        InetAddress[] addr = InetAddress.getAllByName(hostName);
        //           
        //         
        for(InetAddress address : addr) 
        { 
          System.out.println(address.getHostAddress()); 
        } 
      } 
      else 
      { 
        System.out.println(InetAddress.getLocalHost().getHostAddress());
      } 
    } 
    catch(Exception e) 
    { 
      e.printStackTrace(); 
    } 
  } 
}

三、サーバー側プログラム
サーバ・エンド・アプリケーション・サーバ・ソcketクラスを使用してソケットを作成し、ローカル・ポートにバインドします.

ServerSocket sock = new ServerSocker(8000);

sock.accept()メソッドは、クライアント接続がある場合にのみ、新しい接続を表すSocketオブジェクトを返します.つまり、ブロックが発生します.ここでは、通常、各接続に新しいスレッドを開いてサービスします.次に、サービス側が8400ポートで接続を待機し、接続が来るたびにスレッドを新たに開き、接続情報をログファイルに書き込む完全な例を示します.

package cls; 
import java.io.*; 
import java.net.*; 
import java.util.*; 
public class ServerDemo 
{ 
  /** 
   * @param args 
   */ 
  public static void main(String[] args) 
  { 
    try 
    { 
      //ServerSocket servSocket = new ServerSocket(8000); 
      ServerSocket servSocket = new ServerSocket(8400); 
      int amount = 0; 
      while(true) 
      { 
        Socket client = servSocket.accept(); 
        ++amount; 
        Date time = new Date(); 
        String prompt = time.toString() + ":  " + amount + "    " + client.getInetAddress().getHostAddress() + "    
"; System.out.print(prompt); // ServerDemo.writeLog(prompt); // //start a new Thread Thread th = new Thread(new ServThread(client,amount)); th.start(); } } catch(Exception e) { e.printStackTrace(); } } // public static void writeLog(String str) { File logFile = new File("server-log.txt"); try { FileWriter out = new FileWriter(logFile,true); out.append(str); out.close(); } catch(Exception e) { e.printStackTrace(); } } } /* * */ class ServThread implements Runnable { private Socket client; private int ix; public ServThread(Socket soc,int ix) { client = soc; this.ix = ix; } public void run() { try { InputStream inStream = client.getInputStream(); OutputStream outStream = client.getOutputStream(); Scanner recv = new Scanner(inStream); PrintWriter send = new PrintWriter(outStream,true); send.println(" ~ ![ 'bye' ]"); while(recv.hasNextLine()) { String str = recv.nextLine(); if(str.equals("bye")) { send.println("See you later ~ ^-^"); break; } send.println(" , "); } Date time = new Date(); String prompt = time.toString() + ": " + ix + " " + client.getInetAddress().getHostAddress() + "
"; System.out.print(prompt); ServerDemo.writeLog(prompt); // client.close(); } catch(Exception e) { e.printStackTrace(); } } }

このプログラムはすでにサーバーに置かれています.telnet youthol.tk 8400コマンドを使用して、このプログラムの実行結果を体験することができます.
本稿で述べたjavaプログラムの設計に役立つことを願っています.