如何用java实现tcp connect,tcp syn端口扫描
connect比较简单,就是用Socket+多线程,每个端口创建一次连接,没连上是不会往下执行的,会抛出异常,网上有源码,都是这个 *** 。
syn和FIN还不知道咋实现,可以考虑用本地 *** 。
如何用java语言实现端口扫描器
使用 DatagramSocket(int port) 建立socket(套间字)服务。
将数据打包到DatagramPacket中去
通过socket服务发送 (send() *** )
关闭资源
public static void main(String[] args) {
DatagramSocket ds = null; //建立套间字udpsocket服务
try {
ds = new DatagramSocket(8999); //实例化套间字,指定自己的port
} catch (SocketException e) {
System.out.println("Cannot open port!");
System.exit(1);
}
byte[] buf= "Hello, I am sender!".getBytes(); //数据
InetAddress destination = null ;
try {
destination = InetAddress.getByName("192.168.1.5"); //需要发送的地址
} catch (UnknownHostException e) {
System.out.println("Cannot open findhost!");
System.exit(1);
}
DatagramPacket dp =
new DatagramPacket(buf, buf.length, destination , 10000);
//打包到DatagramPacket类型中(DatagramSocket的send() *** 接受此类,注意10000是接受地址的端口,不同于自己的端口!)
try {
ds.send(dp); //发送数据
} catch (IOException e) {
}
ds.close();
}
}
接收步骤:
使用 DatagramSocket(int port) 建立socket(套间字)服务。(我们注意到此服务即可以接收,又可以发送),port指定监视接受端口。
定义一个数据包(DatagramPacket),储存接收到的数据,使用其中的 *** 提取传送的内容
通过DatagramSocket 的receive *** 将接受到的数据存入上面定义的包中
使用DatagramPacket的 *** ,提取数据。
关闭资源。
import java.net.*;
public class Rec {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(10000); //定义服务,监视端口上面的发送端口,注意不是send本身端口
byte[] buf = new byte[1024];//接受内容的大小,注意不要溢出
DatagramPacket dp = new DatagramPacket(buf,0,buf.length);//定义一个接收的包
ds.receive(dp);//将接受内容封装到包中
String data = new String(dp.getData(), 0, dp.getLength());//利用getData() *** 取出内容
System.out.println(data);//打印内容
ds.close();//关闭资源
}
}
谁有java本地监听与远程端口扫描 源程序
本地端口监听
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SocketServer
{
private ServerSocket serverSocket;
private ExecutorService executorService;// 线程池
private final int POOL_SIZE = 600;// 单个CPU线程池大小
public SocketServer() throws IOException
{
serverSocket = new ServerSocket(9888);//监听的端口号
// Runtime的availableProcessor() *** 返回当前系统的CPU数目.
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE);
System.out.println("服务器启动");
}
public void service()
{
while (true)
{
Socket socket = null;
try
{
// 接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket = serverSocket.accept();
executorService.execute(new Handlers(socket));
//这里就是放业务逻辑的地方例如获取数据等等
} catch (Exception e)
{
e.printStackTrace();
System.out.println("socket Exception:" + e);
}
}
}
public static void main(String[] args) throws IOException
{
//Thread thread = new Thread(new PringtThread());
//thread.start();
new SocketServer().service();
}
}
端口扫描代码
import java.io.IOException;
import java.net.Socket;
public class SearchPort implements Runnable
{
public static void main(String[] args)
{
SearchPort searchPort = new SearchPort();
Thread thread = new Thread(searchPort);
thread.start();
}
@Override
public void run()
{
searchPort("192.168.1.2", 0, 9999);
}
public void searchPort(String ip,int begin, int end) {
// 1-65535
Socket s = null;
for (int i = begin; i end; i++) {
boolean flag = false;
try {
s = new Socket(ip, i);
flag = s.isConnected();
} catch (IOException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
}
if (flag) {
System.out.println("port " + i + " is open");
try {
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
// System.out.println("port " + i + " is close");
}
}
//System.out.println("seach port :" + begin + " to " + end + " ok..");
}
}
之一个端口监听的采用了线程池的技术,当大数据来的时候也不怕(某大型企业的部分源码),第二个例子是端口扫描器,采用了多线程扫描,代码直接复制就可以用的,从10点50分打代码11点半,不容易,望楼主采纳,有什么问题可以问我
0条大神的评论