如何在Java中打开许多TCP连接

时间:2017-01-07 12:39:43

标签: java linux tcp sip

我必须打开大量TCP连接到在linux上运行的SIP服务器。我尝试使用Java中的一个简单客户端程序,但我无法打开另一个Linux服务器的350个连接。我想打开~5万以上的负载/性能测试。

有没有办法克服这个问题?有什么限制? 对不起,如果这是一个愚蠢的问题,我是初学者。

由于

客户端程序

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

3 个答案:

答案 0 :(得分:1)

您只能使用1023以上的端口。较低的数字是保留的。

答案 1 :(得分:0)

这是一个编程逻辑问题。访问run方法中的端口值并不意味着,第一个线程将端口设置为1000,下一个端口设置为1001.可以成功使用incrementAndGet()递增端口值以按顺序绑定端口。 / p>

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

答案 2 :(得分:0)

您不需要指定本地IP地址或本地端口。操作系统将为您完成此操作。如果你的端口用完了,那么就是这样:这意味着你的测试并不现实。没有一个真正的客户端会耗尽本地端口空间。不要测试不属于问题空间的东西。