依然是没有人回答吗?即使不会也可以关注一下嘛。国内好像用java的确实不多。

解决方案 »

  1.   

                string saveResult=new string();
                for(int i=0;i<30;i++){
                    try{
                        InetAddress address=InetAddress.getByName(arg[0]);
                        mythread st=new mythread(address,i,saveResult);//将此传递给线程
                        st.start();
                    }catch(IOException e){
                        System.out.println("异常");
                    }
                }//****************************************************/
    //    类名:    mythread
    //    功能:    继承Thread,用于传递参数,得到返回值
    //    参数:    int i    端口
    //****************************************************/
    class mythread extends Thread{
        private int port;
        private InetAddress myaddress;
        //public String strResult=new String();
        public mythread(InetAddress address,int i,string strResult){
            myaddress=address;
            port=i;
        }    public void run(){
            try{
                Socket socket = new Socket(myaddress,port);
                strResult+=port;
                System.out.println(strResult);
                System.out.println("第"+port+"端口已经扫描.......................打开!!");  //这个时侯我需要把port加入返回值中
            }catch(IOException e){
                System.out.println("第"+port+"端口已经扫描...............关闭");
            }
        }//    public String rethread(){
    //        return strResult;  //??
    //    }
    }
    这样就可以了
      

  2.   

    String PortRecord;
    String CurrentPort;
    for(int i=0;i<30;i++){
                    try{
                        InetAddress address=InetAddress.getByName(arg[0]);
                        mythread st=new mythread(address,i);
                        st.start();
                        CurrentPort=st.rethread();
                        PortRecord=+CurrentPort;
                    }catch(IOException e){
                        System.out.println("异常");
                    }
                }
    //****************************************************/
    //    类名:    mythread
    //    功能:    继承Thread,用于传递参数,得到返回值
    //    参数:    int i    端口
    //****************************************************/
    class mythread extends Thread{
        private int port;
        private InetAddress myaddress;
        public String strResult=new String();
        public mythread(InetAddress address,int i){ 
            myaddress=address;
            port=i;
        }
        
        public void run(){
            try{        
                Socket socket = new Socket(myaddress,port);
                strResult+=port;
                System.out.println(strResult);
                System.out.println("第"+port+"端口已经扫描.......................打开!!");  //这个时侯我需要把port加入返回值中
            }catch(IOException e){            
                System.out.println("第"+port+"端口已经扫描...............关闭");
            }        
        }
        
        public String rethread(){
            return strResult;  //??
        }
    }PortRecord is 所有端口
      

  3.   

    kevindude(kevin)的方法存在问题,mythread中的构造子的参数怎么能用到run()方法中?可以考虑定义一全局变量,但存在一个问题:import java.net.*;
    import java.io.*;
    public class scan2{
    public static String res="";
    public static void main(String[] args){
    for(int i=0;i<100;i++){
                    try{
                        InetAddress address=InetAddress.getByName(args[0]);
                        mythread st=new mythread(address,i);
                        st.start();                                                            
                    }catch(IOException e){
                        System.out.println("异常");
                    }
                }
                while(res.equals(""));        //《-------这是一个问题,获得这个值的时间未知。
                System.out.println(res);
    }
    }
    //****************************************************/
    //    类名:    mythread
    //    功能:    继承Thread,用于传递参数,得到返回值
    //    参数:    int i    端口
    //****************************************************/
    class mythread extends Thread{
        private int port;
        private InetAddress myaddress;
       // public String strResult="";
        public mythread(InetAddress address,int i){ 
            myaddress=address;
            port=i;
        }
        
        public void run(){
            try{        
                Socket socket = new Socket(myaddress,port);
                synchronized (scan2.res){
               scan2.res+=port;}
    //            System.out.println(strResult);
     //           System.out.println("第"+port+"端口已经扫描.......................打开!!");  //这个时侯我需要把port加入返回值中
            }catch(IOException e){            
               // System.out.println("第"+port+"端口已经扫描...............关闭");
            }        
        }
        
    //    public String rethread(){
    //        return strResult;  //??
    //    }
      

  4.   

    kevindude可否再解释一下,我不懂,
    saveResult也可以像C++中的指针一样使用吗?我还不太明白你的意思而且这句也被屏蔽了,这是为何?
    //    public String rethread(){
    //        return strResult;  //??
    //    }
    不过这里好像还没等run执行完就已经return了,结果为空。
      

  5.   

    lmy2000:编译不通过:FilterThread.java:5: 期望class或interface
    public static String res="";
                  ^
    1 个错误
      

  6.   

    love722915(xiaojun)的方法忽略了主线程和支线程是并行处理的,有可能你的支线程还没处理(还未检测端口)主线程已经调用了空返回值了。
      

  7.   

    多谢lmy2000,已经搞定。但有有个问题:
    我在for执行完后就读取res,而实际上大部分的线程还没有执行完毕,此结果难免不准确。
    虽然连接成功的速度比连接失败的速度要快多了。
      

  8.   

    to:lmy2000(pluto) 
    对不起,是我搞错了,应该是这样
                string saveResult=new string();
                for(int i=0;i<30;i++){
                    try{
                        InetAddress address=InetAddress.getByName(arg[0]);
                        mythread st=new mythread(address,i,saveResult);//将此传递给线程
                        st.start();
                    }catch(IOException e){
                        System.out.println("异常");
                    }
                }//****************************************************/
    //    类名:    mythread
    //    功能:    继承Thread,用于传递参数,得到返回值
    //    参数:    int i    端口
    //****************************************************/
    class mythread extends Thread{
        private int port;
        private InetAddress myaddress;
        public String strResult;
        public mythread(InetAddress address,int i,string strResult){
            myaddress=address;
            port=i;
            this.strResult=strResult;
        }    public void run(){
            try{
                Socket socket = new Socket(myaddress,port);
                strResult+=port;
                System.out.println(strResult);
                System.out.println("第"+port+"端口已经扫描.......................打开!!");  //这个时侯我需要把port加入返回值中
            }catch(IOException e){
                System.out.println("第"+port+"端口已经扫描...............关闭");
            }
        }//    public String rethread(){
    //        return strResult;  //??
    //    }
    }
    to:AntGhazi(蚂蚁勇士) 
    首先,线程不是函数,不能返回值。
    当thread.start被调用后运行的是run()中的代码,其余的函数是不会自动运行的,
    所以要把所有要运行的代码都放在run()中。
    至于saveResult它是一个指向string类型的引用,我想在c++中也有这个概念吧。
      

  9.   

    在love722915(xiaojun)的程序中使用activeCount()检测线程是否已执行完毕,然后统计。
    String PortRecord;
    String CurrentPort;
    for(int i=0;i<30;i++){
                    try{
                        InetAddress address=InetAddress.getByName(arg[0]);
                        mythread st[i]=new mythread(address,i);
                        st[i].start();
                    }catch(IOException e){
                        System.out.println("异常");
                    }
                }
             while(true) {
                if(st[0].activeCount()==0)
                   for(int i=0;i<30;i++){
                        CurrentPort=st[i].rethread();
                        PortRecord=+CurrentPort;
                   }
                   break;
                }
             }