小弟目前在做的这个东东需要许多端口进行通信,想请教一下,java中可否有办法返回系统中暂时未用到的端口号?如有,如何做?
    感激不尽!!!

解决方案 »

  1.   

    java可以调用系统命令,
    WIN系统好像有个命令,
    列出了有哪些端口被占用了.
    你可以试试这个方法.
      

  2.   

    public int getFreePort(){//获取空闲端口
    ServerSocket tmp;
    int i=MINPORT;
    for(;i<=MAXPORT;i++){
    try{
    tmp=new ServerSocket(i);
    tmp.close();
    tmp=null;
    return i; 
    }
    catch(Exception e4){
    System.out.println("端口"+i+"已经被占用");
    }
    }
    return -1;
    }
    在[MINPORT,MAXPORT]端口范围内获取空闲端口
      

  3.   

    public static boolean isOpenPort(String ip,int port){
            boolean bl = false;
            try {
                Socket socket = new Socket(ip, port);            
                bl = true;            
                socket.close();
                socket = null;
            } catch (IOException ex) {
                //ex.printStackTrace();            
                bl = false;
            }
            return bl;
        }
      

  4.   

    用cseu(飘) 和lanlanq(麒麟在天) 均可
      

  5.   

    netstat -na返回正在使用的端口!
      

  6.   

    没有这样的必要吧,你完全可以new ServerSocket(0).getLocalPort() 来返回这个ServerSocket已经绑定到的端口
      

  7.   

    用cseu(飘) 和lanlanq(麒麟在天) 均可
      

  8.   

    写了一个,不过是单线程扫描比较慢。
    ----------------------------
    import java.net.*;
    import java.io.*;
    public class PortScanner{       
      public static void main(String args[]){
        String hostName;      
        int lowerPort=0;   //扫描起始端口;
        int upperPort=1024;  //扫描终止端口;
        if(args.length>0)
          hostName=args[0];
        else
          hostName="localhost";
          for(int i=lowerPort;i<=upperPort;i++){
            try{
              Socket mysocket ;
              mysocket=new Socket(hostName,i);
              System.out.println("端口 "+i+" 被占用!");
            
          }catch(IOException e){
            System.out.println(e.getMessage());
          }
        }
      }
    }
      

  9.   

    最近总发现有人原封不动地抄人家的回帖,比如前面的 sundeveloper(51TTUP),难道是机器人?!~~
      

  10.   

    lanlanq(麒麟在天) 的方法不太好
      

  11.   

    lanlanq(麒麟在天)的不对,因为是服务器端。药用ServerSocket。
    cseu(飘) 的可以,当不能简单的用Exception,例外因该分的详细一些。
    BindException() 
    SocketException()
    IOException()
    等。
      

  12.   

    请问你cold_blooded(三天没吃饭)有没有使用到一个极其去测试另一台机器的端口是否打开。楼主页没有指明只是服务器端进行测试查找,况且就是在服务器端也是可以的,我的方法,我的系统中也使用到辽,是正确的。你测试了吗,怎么能说不对那,难道只有serverSocket才能进行查找端口吗,观点太过片面。最好试验后拿出有力证据在否定别人的。
      

  13.   

    况且你调用一个serversocket是要损耗服务器资源的,如果很多客户端去执行这个操作,会对服务器的增加服务器端的负载,我感觉还是由客户端进行处理这个比较好,这样可以减轻服务器端的压力,我感觉还是这样比较好。
      

  14.   

    cold_blooded(三天没吃饭) 希望你测试以后再说,难道服务器端只能使用ServerSocket吗,难道只会出现服务器自己去查找端口吗。片面!