2009-08-13 9 views
7

ホストからの接続を受け入れるかどうかをテストするには、次のクラスを使用しています。Javaとのテストソケット接続

私の質問は何ですか?フィードバック

EDIT

ため

おかげで私は、秒単位のオプションのパラメータ "タイムアウト" を追加しました。

import java.io.IOException; 
import java.net.Socket; 
import java.net.InetSocketAddress; 
import java.net.SocketAddress; 

public class TestConnection { 

    public static void main(String [] args) { 

     int timeout = 2000; // two seconds  

     if(isInvalidInput(args)) { 

      System.err.println("Usage: java TestConnection remotehost port [timeout_seconds]"); 
      System.exit(-1); 

     } else if (args.length == 3) try { 

      timeout = Integer.parseInt(args[2]) * 1000; 

     } catch(NumberFormatException nfe){} 

     String host = args[0]; 
     String port = args[1]; 

     System.out.printf("Attempting: %s port: %s ....\n", host, port); 

     Socket socket = new Socket(); 
     InetSocketAddress endPoint = new InetSocketAddress(host, 
               Integer.parseInt(port) ); 

     if (endPoint.isUnresolved()) { 

      System.out.println("Failure " + endPoint); 

     } else try { 

      socket.connect( endPoint , timeout); 
      System.out.printf("Success: %s \n", endPoint); 

     } catch(IOException ioe) { 

      System.out.printf("Failure: %s message: %s - %s \n", 
       endPoint , ioe.getClass().getSimpleName(), ioe.getMessage()); 

     } finally { 

      if (socket != null) try { 
       socket.close(); 
      } catch(IOException ioe) {} 

     } 

    } 

    /** 
    * Validates the number of arguments is exactly 2 and the second is a number. 
    * @return true is args.length == 2 && args[1].matches(\\d+); 
    */ 
    private static final boolean isInvalidInput(String [] args) { 
     return (args.length < 2 
        || (args.length >= 2 && !args[1].matches("\\d+"))); 
    } 

} 
+2

if()try {constructs:P – OscarRyz

+2

私はあなたのソウルメイトに会いたいとは思っていません:) – mgarciaisaia

答えて

3

拡張?コードの複雑さについて言えば、ループはありません(while)。条件は1つだけです(if)。そのため、複雑さをほとんど減らすことはできません。

引数の使用状況を表示しているので、私はこれがユーザ自身のコードの別の部分ではなくユーザによって使用されると仮定しています。あなたはこれを保持する必要があります。

応答がないときにホストに連絡するのに時間がかかることが心配な場合は、独自のタイムアウトを設定できます。タイムアウトに慣れていない場合read this

あなたのコードは、ホストが応答する場合に最適です。

+0

接続するにはあまりにも多くの時間がかかると、実際にはバグです。私はオプションのパラメータ "タイムアウト"を処理するためにこのバージョンを修正しました。 "isUnresolved()"メソッドを使うのが良いかどうかは疑問です。 :) – OscarRyz

+2

注意:名前解決とは、ホスト名がIPアドレスにリンクしているかどうかを調べることです。それは同じことではありません。たとえば、www.google.comは66.102.1.147に解決できます。 –

+0

また、 "else if(args.length == 3)"は、システムがifで終了するので役に立たない。 empy catch(NumberFormatException)を残してはいけません。それは良い習慣ではありません。ユーザーが数字でない値を入力した場合、コードは2000に自動的に戻ります。この場合、沈黙は良好ですが、そうではありません。 –

2

コードは非常に妥当です。それは短いので、切り取らなければならない余りがありません。

私がポートスキャナをコーディングしていた場合は、isInvalidInputメソッドを削除します。その代わりに、私は入力が有効だったと仮定します。ユーザーが有効な整数でないものを入力した場合、そこに解析エラーをキャッチして、再入力するように指示します。