相信很多人都用过类似“飞鸽传书”的局域网内聊天工具吧??打开的时候软件会对局域网内所有用户进行扫描,把在线的都列出来我想,它应该就是一开软件就对局域网上所有用户的某个端口发送消息,如果有开这个软件,它就会回复自己的ip、计算机名等信息的。但是我们学的java对一个端口发送消息等待回应,如果那台机端口关闭的话好象要等很久啊??我想问的就是:
如何快速的对整个局域网的所有计算机的某个端口扫描,辨别那个端口是否打开??

解决方案 »

  1.   


    我说呢,我一直郁闷为什么我来一下那么慢他来一下那么快呢那么有没有谁有这样的小例子发来参考参考??
    如果没有的话,也欢迎提供几个需要用到的类,我看看api doc也好,先谢谢咯
      

  2.   

    建议看一下nmap ,一个开源的端口扫描工具.
      

  3.   


    import java.io.*;
    import java.net.*;
    import java.util.*;
    public class SocketPort {public static void main(String[] args) { String ip = "192.168.0.1"; 
     String hostname = new String();  try{ //get the target ip address and hostname
       InetAddress address = InetAddress.getByName(ip);
       System.out.println(address);
       hostname = address.getHostName();
       System.out.println(hostname);
     }
     catch(UnknownHostException e){
        System.out.println("Could not find "+ ip); }
     try{ // creat the output file
        PrintWriter fout = new PrintWriter( new FileWriter("PortInf.txt"));
        fout.println("Information Of The Port On the " + hostname +"computer ");
        System.out.println("Information Of The Port On the " + hostname +"computer ");
        fout.println(); // do ports scan
     for(int nport = 24;nport <= 60;++nport){
       try{   Socket s = new Socket(hostname,nport);
       fout.println("The port " + nport + " is open!");
       System.out.println("The port " + nport + " is open!");   fout.println("Connected to "+ s.getInetAddress() + " on port " + s.getPort() + " from port "+       s.getLocalPort() + " of " + s.getLocalAddress());
       System.out.println("Connected to "+ s.getInetAddress() + " on port " + s.getPort() + " from port "+        s.getLocalPort() + " of " + s.getLocalAddress());  //print the connected socket information
    }catch(IOException e){
       fout.println("The port " + nport + " is closed!");
       System.out.println("The port " + nport + " is closed!");}}
    fout.close();}
    catch(IOException e){}}
    }
      

  4.   

    http://www.sudu.cn/info/html/edu/jsp/20071219/121327.html
      

  5.   

    java.net.DatagramSocket 能用到这个类。
      

  6.   

    找了一天,广播的没有找到,找到个所谓的多播   MulticastSocket
    虽然还没实现功能,继续摸索晚上回来结贴,有补充的继续补充哦,嘿嘿
      

  7.   

    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.LineNumberReader;public class IPTest { public static void main(String[] args) {
    String str = ""; try {
    for (int i = 2; i < 254; i++) { Process p = Runtime.getRuntime().exec(
    "ping 192.168.0." + i + " -w 300 -n 1");
    InputStreamReader is = new InputStreamReader(p.getInputStream());
    LineNumberReader lnr = new LineNumberReader(is); for (int j = 1; j < 7; j++) {
    lnr.readLine(); } str = lnr.readLine();
    if (str.length() < 17
    || str.substring(8, 17).equals("timed out")) {
    continue;
    } else {
    System.out.println("192.168.0." + i);
    }
    } } catch (IOException e) {
    e.printStackTrace();
    }
    }}扫描局域网内的IP地址,自己试试
      

  8.   

    Broadcast
    记得以前弄过局域网的即时通 好像用到过·
      

  9.   

    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.InetSocketAddress;
    import java.net.PortUnreachableException;
    import java.net.SocketException;
    import java.net.SocketTimeoutException;
    public class ClientFinder { private static final int PORT = 6789;
    private static final String REQ_MSG = "HI";
    private static final String RES_MSG = "OK";
    private static byte[] REQ_DATA = null;
    private static byte[] RES_DATA = null; static {
    try {
    REQ_DATA = REQ_MSG.getBytes("UTF-8");
    RES_DATA = RES_MSG.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    System.exit(1);
    }
    } public static class Listener implements Runnable { private static final int BUF_SIZE = 100;
    private final DatagramSocket ds; public Listener(DatagramSocket ds) {
    if (ds == null) throw new IllegalArgumentException("ds is null");
    this.ds = ds;
    } public void run() {
    DatagramPacket dp = new DatagramPacket(new byte[BUF_SIZE], 0, BUF_SIZE);
    try {
    while (true) {
    try {
    this.ds.receive(dp);
    InetAddress ipa = dp.getAddress();
    String msg = new String(
    dp.getData(),
    dp.getOffset(),
    dp.getLength(),
    "UTF-8"
    );
    if (REQ_MSG.equals(msg)) {
    this.ds.send(new DatagramPacket(
    RES_DATA, 0, RES_DATA.length,
    dp.getAddress(), dp.getPort()
    ));
    } else if (RES_MSG.equals(msg)) {
    System.out.println(ipa + " > " + msg);
    } else {
    }
    } catch (SocketTimeoutException e) {
    } catch (PortUnreachableException e) {
    } catch (SocketException e) {
    throw e;
    } catch (IOException e) {
    }
    }
    } catch (SocketException e) {
    }
    } }
    public static class Sender implements Runnable { private final DatagramSocket ds; public Sender(DatagramSocket ds) {
    if (ds == null) throw new IllegalArgumentException("ds is null");
    this.ds = ds;
    } public void run() {
    try {
    this.ds.send(new DatagramPacket(
    REQ_DATA, 0, REQ_DATA.length,
    new InetSocketAddress("255.255.255.255", PORT)
    ));
    } catch (PortUnreachableException e) {
    } catch (SocketException e) {
    } catch (IOException e) {
    }
    } }
    public static void main(String[] args) {
    DatagramSocket dgskt = null;
    try {
    dgskt = new DatagramSocket(PORT);
    new Thread(new Listener(dgskt)).start();
    new Thread(new Sender(dgskt)).start();
    } catch (SocketException e) {
    e.printStackTrace();
    } finally {
    if (dgskt != null) {
    //dgskt.close();
    }
    }
    }}