2017-01-07 8 views
1

Linuxで実行されているSIPサーバには、たくさんのTCP接続を開く必要があります。私はJavaで簡単なクライアントプログラムを試してみましたが、他のLinuxサーバから350の接続もできませんでした。私は負荷/性能テストのために50,000以上を開きたいと思う。Javaで多くのTCP接続を開くには

これを解決する方法はありますか?限界は何ですか? 申し訳ありませんが、これは愚かな質問であれば、私は初心者です。

おかげ

クライアントプログラムにのみ、下の数字が予約されている1023を超えるポートを使用することができます

public class ConnectionTcp 
{ 
static int noOfconnected; 
Socket socket; 
static int port=1000; 
static Object obj=new Object(); 
static AtomicInteger atomicInteger; 
public static void main(String[]args) 
{ 
try{ 
ConnectionTcp con=new ConnectionTcp(); 
atomicInteger = new AtomicInteger(); 
Date date = new Date(); 
for(int i=0;i<50000;i++) 
{ 
port+=i;  

con.sendmsg(); 
} 
} 
catch(Exception e) 
{ 
System.out.println(e); 
} 
} 
public synchronized void sendmsg(){ 
     try{ 
     Thread.sleep(100); 
     } 
     catch(Exception e){ 
     System.out.println(e); 
     }  
     Runnable r=new Runnable(){ 
      public void run(){ 
       try{ 
        boolean check=true; 
        InetAddress ip=InetAddress.getByName("131.10.20.16"); 
        Socket socket=new Socket("131.10.20.17",5060,ip,port);    
        System.out.println("conected is "+socket.isConnected()+"<----------with port----------->"+socket.getLocalPort()); 


        OutputStream out =socket.getOutputStream(); 
        InputStream in =socket.getInputStream(); 
         String str = "keep alive"; 
         byte[] array = str.getBytes();   
        System.out.println("no of user connected with server is "+atomicInteger.incrementAndGet()); 
        while(true){      
         try{ 
          int i = in.read(); 
          out.write(array);       
         }catch(Exception e){ 
          System.out.println("exception"+e); 
          atomicInteger.decrementAndGet(); 
          socket.close(); 
          Date date = new Date();  
          System.out.println("Ented Time is "+date.toString()); 
          break; 
         } 
        } 
       }catch(Exception e1){ 
       System.out.println("main exception"+e1); 
       atomicInteger.decrementAndGet(); 
       } 
      } 
     }; 
     (new Thread(r,"tcp")).start();   
    } 
} 
+2

350接続試行でエラーが発生しましたか? – RamPrakash

+0

例外は「exceptionjava.lang.IllegalArgumentException:ポートが範囲外です。」、サーバポートの範囲は15000〜61000です.1000,2001,40005ではなく1000,1001,1002 ...のように1つずつソースポートを割り当てられません。 ......私は、すべてのポートが忙しいとは思っていません。Linux上でss -sコマンドでチェックしてみましたが、33 TCP接続しか表示されません。 –

+0

ソースコードを入力してください。スレッドを使用していますか?あなたのjvmの議論は何ですか? また、あなたの質問に少し触れてください。そうでなければ、助けを得ることはできません。 – Gewure

答えて

0

ローカルIPアドレスとローカルポートのどちらも指定する必要はありません。オペレーティングシステムがそれを行います。あなたがポートを使い果たした場合、それはそうです:つまり、あなたのテストは現実的ではないということです。単一の実際のクライアントはローカルポートスペースを使い果たすつもりはありません。問題空間の一部ではないものをテストしないでください。

1

0

プログラミングロジックの問題です。 runメソッド内のポート値にアクセスすることは意味しません。最初のスレッドはポートを1000に、次のスレッドを1001として取得します。ポート値をincrementAndGet()でインクリメントしてポートを順番にバインドできます。

public class ConnectionTcp 
{ 
static AtomicInteger atomicInteger; 
public static void main(String[]args) 
{ 
ConnectionTcp con=new ConnectionTcp(); 
atomicInteger_=new AtomicInteger(1000); 
for(int i=0;i<5000;i++) 
{ 
con.sendmsg(); 
} 
} 
public synchronized void sendmsg(){  
     Runnable r=new Runnable(){ 
      public void run(){ 
       try{      
        InetAddress ip=InetAddress.getByName("192.168.1.22");     
        int port = atomicInteger.incrementAndGet();     
        Socket socket=new Socket("131.10.20.17",5060,ip,port);     
        OutputStream out =socket.getOutputStream(); 
        InputStream in =socket.getInputStream(); 
         String str = "keep alive"; 
         byte[] array = str.getBytes();      
        while(true){      
         try{ 
          int i = in.read(); 
          out.write(array);       
         }catch(Exception e){ 
          System.out.println("exception"+e);        
          socket.close();      
          break; 
         } 
        } 
       }catch(Exception e1){ 
       System.out.println("main exception"+e1);      
       } 
      } 
     }; 
     (new Thread(r,"tcp")).start();   
    } 
} 
+0

いいえ、それは唯一の方法ではありません。 'volatile'と宣言したり、' synchronized'メソッドやブロックを使って取得したり設定したりできます。 – EJP

+1

はい、あなたは正しいです。私はすべての言葉を非常に慎重に使用する必要があります。そのための –

+0

@ジョナサンローゼンによれば、あなたは1023のポートしか使用できません。 また、あなたが何らかの理由で(私は本当に理由が分からない)、あなたがポートを使用している他のサービスを持っていないことを確認してください。 最初は100ポートでこれを制限します。 – Gewure

関連する問題