相信很多人都用过类似“飞鸽传书”的局域网内聊天工具吧??
打开的时候软件会对局域网内所有用户进行扫描,把在线的都列出来
我想,它应该就是一开软件就对局域网上所有用户的某个端口发送消息,如果有开这个软件,它就会回复自己的ip、计算机名等信息的。
但是我们学的java对一个端口发送消息等待回应,如果那台机端口关闭的话好象要等很久啊??
我想问的就是:
如何快速的对整个局域网的所有计算机的某个端口扫描,辨别那个端口是否打开??
网友回复:那是使用广播实现的。可不是每个机器进行尝试连接哦!
网友回复:用过飞鸽,没研究过....顶下
网友回复: 引用 1 楼 java2000_net 的回复:
那是使用广播实现的。可不是每个机器进行尝试连接哦!
我说呢,我一直郁闷为什么我来一下那么慢他来一下那么快呢
那么有没有谁有这样的小例子发来参考参考??
如果没有的话,也欢迎提供几个需要用到的类,我看看api doc也好,先谢谢咯
网友回复:建议看一下nmap ,一个开源的端口扫描工具.
网友回复:mark 学习
网友回复:
网友回复:http://www.sudu.cn/info/html/edu/jsp/20071219/121327.html
网友回复: java.net.DatagramSocket 能用到这个类。
网友回复:找了一天,广播的没有找到,找到个所谓的多播 MulticastSocket
虽然还没实现功能,继续摸索
晚上回来结贴,有补充的继续补充哦,嘿嘿
网友回复:顶一下
网友回复: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地址,自己试试
网友回复:补充一句,上边那个示例曾经做过飞鸽,但没有完全实现
网友回复:不是你去问它,是它来告诉你!
网友回复:Broadcast
记得以前弄过局域网的即时通 好像用到过·
网友回复:
打开的时候软件会对局域网内所有用户进行扫描,把在线的都列出来
我想,它应该就是一开软件就对局域网上所有用户的某个端口发送消息,如果有开这个软件,它就会回复自己的ip、计算机名等信息的。
但是我们学的java对一个端口发送消息等待回应,如果那台机端口关闭的话好象要等很久啊??
我想问的就是:
如何快速的对整个局域网的所有计算机的某个端口扫描,辨别那个端口是否打开??
网友回复:那是使用广播实现的。可不是每个机器进行尝试连接哦!
网友回复:用过飞鸽,没研究过....顶下
网友回复: 引用 1 楼 java2000_net 的回复:
那是使用广播实现的。可不是每个机器进行尝试连接哦!
我说呢,我一直郁闷为什么我来一下那么慢他来一下那么快呢
那么有没有谁有这样的小例子发来参考参考??
如果没有的话,也欢迎提供几个需要用到的类,我看看api doc也好,先谢谢咯
网友回复:建议看一下nmap ,一个开源的端口扫描工具.
网友回复:mark 学习
网友回复:
-
Java code
-
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ 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){} } }
网友回复:http://www.sudu.cn/info/html/edu/jsp/20071219/121327.html
网友回复: java.net.DatagramSocket 能用到这个类。
网友回复:找了一天,广播的没有找到,找到个所谓的多播 MulticastSocket
虽然还没实现功能,继续摸索
晚上回来结贴,有补充的继续补充哦,嘿嘿
网友回复:顶一下
网友回复: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地址,自己试试
网友回复:补充一句,上边那个示例曾经做过飞鸽,但没有完全实现
网友回复:不是你去问它,是它来告诉你!
网友回复:Broadcast
记得以前弄过局域网的即时通 好像用到过·
网友回复:
-
Java code
-
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ 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(); } } } }
转载于:https://blog.51cto.com/wanghuan/318297