java如何编程实现,获取固定IP发来所有的数据包 ?

高手指点:我想实现获取某个固定IP发来的所有的数据包,不管是那个端口发来的都要能得到,java编程如何实现?谢谢!!!!!
我主要是不知道怎么写监听端的程序,那个IP的数据发往我的电脑的端口是未知的,高手指点,小弟高分献上!!!!

java获取固定IP发来所有的数据包,需要实现网络嗅探的部分功能:

代码如下;

/*******************
* JpcapTip.java
*/
package m;

import jpcap.PacketReceiver;
import jpcap.JpcapCaptor;
import jpcap.packet.*;
import jpcap.NetworkInterface;
import jpcap.NetworkInterfaceAddress;
//import java.net.InetAddress;
//import java.net.UnknownHostException;

public class JpcapTip implements PacketReceiver {

public void receivePacket(Packet packet) {
   System.out.println("********************************************");
   /*IP数据报报文头*/
   byte[] l=packet.header;     
   /*
   for (int t=0;t<21;t++){
    System.out.print(l[t]+" *** ");
   }
   */
   String str="";
    System.out.print("报文头 : ");
    for (int i=0;i<l.length;i++) {
     //str=str+l;
     int m=0;
     m=l[i];
     m=m<<24;
     m=m>>>24;
     str=str+Integer.toHexString(m);
     //System.out.print("     ***     "+l[i]);
    }
   System.out.println(str);
   int d=l.length;
   System.out.println("首部长度 ï¼š"+(d*8)+"bit");
  
   /*分析源IP地址和目的IP地址*/
   /*分析协议类型*/
   /**
   if(packet.getClass().equals(IPPacket.class)) {
    IPPacket ipPacket=(IPPacket)packet;
    byte[] iph=ipPacket.option;
    String iphstr=new String(iph);
    System.out.println(iphstr);
   }
   */
   if(packet.getClass().equals(ARPPacket.class))
   {
    System.out.println("协议类型 ï¼šARP协议");
    try {
     ARPPacket arpPacket = (ARPPacket)packet;
     System.out.println("源网卡MAC地址为 ï¼š"+arpPacket.getSenderHardwareAddress());
     System.out.println("源IP地址为 ï¼š"+arpPacket.getSenderProtocolAddress());
     System.out.println("目的网卡MAC地址为 ï¼š"+arpPacket.getTargetHardwareAddress());
     System.out.println("目的IP地址为 ï¼š"+arpPacket.getTargetProtocolAddress());

} catch( Exception e ) {
     e.printStackTrace();
    } 
   }
   else 
    if(packet.getClass().equals(UDPPacket.class))
    {
     System.out.println("协议类型 ï¼šUDP协议");
     try {
      UDPPacket udpPacket = (UDPPacket)packet;
      System.out.println("源IP地址为 ï¼š"+udpPacket.src_ip);
      int tport = udpPacket.src_port;
      System.out.println("源端口为:"+tport);
      System.out.println("目的IP地址为 ï¼š"+udpPacket.dst_ip);
      int lport = udpPacket.dst_port;
      System.out.println("目的端口为:"+lport);
     } catch( Exception e ) {
      e.printStackTrace();
     } 
    }
   else
    if(packet.getClass().equals(TCPPacket.class)) {
     System.out.println("协议类型 ï¼šTCP协议");
     try {
      TCPPacket tcpPacket = (TCPPacket)packet;
      int tport = tcpPacket.src_port;
      System.out.println("源IP地址为 ï¼š"+tcpPacket.src_ip);
      System.out.println("源端口为:"+tport);
      System.out.println("目的IP地址为 ï¼š"+tcpPacket.dst_ip);
      int lport = tcpPacket.dst_port;
      System.out.println("目的端口为:"+lport);
     } catch( Exception e ) {
      e.printStackTrace();
     }
    }
   else
    if(packet.getClass().equals(ICMPPacket.class))
     System.out.println("协议类型 ï¼šICMP协议");
   else
     System.out.println("协议类型 ï¼šGGP、EGP、JGP协议或OSPF协议或ISO的第4类运输协议TP4");

/*IP数据报文数据*/
   byte[] k=packet.data;   
   String str1="";
    System.out.print("数据 : ");
     for(int i=0;i<k.length;i++) {
      //int m=0;
      //m=k[i];
      //m=m<<24;
      //m=m>>>24;
      //str1=str+Integer.toHexString(m);
      str1 = new String(k);
      //str1=str1+k[i];
      //System.out.print("     ***     "+k[i]);
     }
     System.out.println(str1);
   System.out.println("数据报类型 : "+packet.getClass());

   System.out.println("********************************************");
}

public static void main(String[] args) throws Exception{
   // TODO è‡ªåŠ¨ç”Ÿæˆæ–¹æ³•å­˜æ ¹
  
   NetworkInterface[] devices = JpcapCaptor.getDeviceList();        //.getDeviceList();.
   //for (int i =0; i<devices.length;i++) {
    int a=0;
    //try {
    /*本地网络信息*/
    byte[] b=devices[1].mac_address; //网卡物理地址
    //}
    //catch() {}
    System.out.print("网卡MAC : 00");   
    for (int j=0;j<b.length;j++){
     //a=a<<8;
     a=b[j];
     a=a<<24;
     a=a>>>24;
     System.out.print(Integer.toHexString(a));
    }
    System.out.println();
    NetworkInterfaceAddress[] k=devices[1].addresses;
   
    //System.out.println("网卡MAC : "+Integer.toHexString(a));
    for(int n=0;n<k.length;n++) {
     System.out.println("本机IP地址 : "+k[n].address);     //本机IP地址
     System.out.println("子网掩码   : "+k[n].subnet);      //子网掩码
    }
    System.out.println("网络连接类型 : "+devices[1].datalink_description);
   //}
   NetworkInterface deviceName = devices[1];
   /*将网卡设为混杂模式下用网络设备deviceName*/
   JpcapCaptor jpcap =JpcapCaptor.openDevice(deviceName, 2000, false, 1);           //openDevice(deviceName,1028,false,1);
   jpcap.loopPacket(-1,new JpcapTip());
}

}
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-03-10
额。。。初看到你的问题的时候吓了一跳。还以为是用java实现网络嗅探呢。
你问的是socket编程?
那么socket 均分为两个,
一部分是服务端,
一部分是客户端,
服务端一直开启着监听,
现在你的情况和平时不太一样的是,平时,是服务端的ip不变化,而客户端的变化。而是客户端给服务端进行发送。
你的情况是相反。客户端经常变动ip或者端口,而要求服务端发送。
其实转换一下思路就好了。
有点类似于现在网页在线聊天工具里的“长连接”思想。
你的那个固定ip服务器,可以完全不管,你是什么端口。因为,如果你的电脑准备好接受数据了。那么你就向服务端发起请求。而服务端将结果发送给你。就是说,不是说服务器一直给你发送,而是,你这个客户端只要准备好接受数据,就向服务器发送请求。这样,不是没有问题了么。。

如果还按你那个思路就是,你的电脑,需要实现网络嗅探的部分功能。但是

Java是网络层以上的。
你通过Java的Socket得到的数据包嗅探不出什么敏感的东东了。
所以Java不适合做网络嗅探。

不过还好,现在有了叫jpcap的工具。你可以搜一下,
下面是一个简单的实现,里面获得了来源的ip和端口 你可以加一个判断,如果来源ip是固定的ip的话,那么,你可以获取对应的数据包

本程序用eclipse编辑在J2SDK6.0+WinPcap 3.1+Jpcap 0.5下编译运行

/*******************
* JpcapTip.java
*/
package m;

import jpcap.PacketReceiver;
import jpcap.JpcapCaptor;
import jpcap.packet.*;
import jpcap.NetworkInterface;
import jpcap.NetworkInterfaceAddress;
//import java.net.InetAddress;
//import java.net.UnknownHostException;

public class JpcapTip implements PacketReceiver {

public void receivePacket(Packet packet) {
System.out.println("********************************************");
/*IP数据报报文头*/
byte[] l=packet.header;
/*
for (int t=0;t<21;t++){
System.out.print(l[t]+" *** ");
}
*/
String str="";
System.out.print("报文头 : ");
for (int i=0;i<l.length;i++) {
//str=str+l;
int m=0;
m=l[i];
m=m<<24;
m=m>>>24;
str=str+Integer.toHexString(m);
//System.out.print(" *** "+l[i]);
}
System.out.println(str);
int d=l.length;
System.out.println("首部长度 :"+(d*8)+"bit");

/*分析源IP地址和目的IP地址*/
/*分析协议类型*/
/**
if(packet.getClass().equals(IPPacket.class)) {
IPPacket ipPacket=(IPPacket)packet;
byte[] iph=ipPacket.option;
String iphstr=new String(iph);
System.out.println(iphstr);
}
*/
if(packet.getClass().equals(ARPPacket.class))
{
System.out.println("协议类型 :ARP协议");
try {
ARPPacket arpPacket = (ARPPacket)packet;
System.out.println("源网卡MAC地址为 :"+arpPacket.getSenderHardwareAddress());
System.out.println("源IP地址为 :"+arpPacket.getSenderProtocolAddress());
System.out.println("目的网卡MAC地址为 :"+arpPacket.getTargetHardwareAddress());
System.out.println("目的IP地址为 :"+arpPacket.getTargetProtocolAddress());

} catch( Exception e ) {
e.printStackTrace();
}
}
else
if(packet.getClass().equals(UDPPacket.class))
{
System.out.println("协议类型 :UDP协议");
try {
UDPPacket udpPacket = (UDPPacket)packet;
System.out.println("源IP地址为 :"+udpPacket.src_ip);
int tport = udpPacket.src_port;
System.out.println("源端口为:"+tport);
System.out.println("目的IP地址为 :"+udpPacket.dst_ip);
int lport = udpPacket.dst_port;
System.out.println("目的端口为:"+lport);
} catch( Exception e ) {
e.printStackTrace();
}
}
else
if(packet.getClass().equals(TCPPacket.class)) {
System.out.println("协议类型 :TCP协议");
try {
TCPPacket tcpPacket = (TCPPacket)packet;
int tport = tcpPacket.src_port;
System.out.println("源IP地址为 :"+tcpPacket.src_ip);
System.out.println("源端口为:"+tport);
System.out.println("目的IP地址为 :"+tcpPacket.dst_ip);
int lport = tcpPacket.dst_port;
System.out.println("目的端口为:"+lport);
} catch( Exception e ) {
e.printStackTrace();
}
}
else
if(packet.getClass().equals(ICMPPacket.class))
System.out.println("协议类型 :ICMP协议");
else
System.out.println("协议类型 :GGP、EGP、JGP协议或OSPF协议或ISO的第4类运输协议TP4");

/*IP数据报文数据*/
byte[] k=packet.data;
String str1="";
System.out.print("数据 : ");
for(int i=0;i<k.length;i++) {
//int m=0;
//m=k[i];
//m=m<<24;
//m=m>>>24;
//str1=str+Integer.toHexString(m);
str1 = new String(k);
//str1=str1+k[i];
//System.out.print(" *** "+k[i]);
}
System.out.println(str1);
System.out.println("数据报类型 : "+packet.getClass());

System.out.println("********************************************");
}

public static void main(String[] args) throws Exception{
// TODO 自动生成方法存根

NetworkInterface[] devices = JpcapCaptor.getDeviceList(); //.getDeviceList();.
//for (int i =0; i<devices.length;i++) {
int a=0;
//try {
/*本地网络信息*/
byte[] b=devices[1].mac_address; //网卡物理地址
//}
//catch() {}
System.out.print("网卡MAC : 00");
for (int j=0;j<b.length;j++){
//a=a<<8;
a=b[j];
a=a<<24;
a=a>>>24;
System.out.print(Integer.toHexString(a));
}
System.out.println();
NetworkInterfaceAddress[] k=devices[1].addresses;

//System.out.println("网卡MAC : "+Integer.toHexString(a));
for(int n=0;n<k.length;n++) {
System.out.println("本机IP地址 : "+k[n].address); //本机IP地址
System.out.println("子网掩码 : "+k[n].subnet); //子网掩码
}
System.out.println("网络连接类型 : "+devices[1].datalink_description);
//}
NetworkInterface deviceName = devices[1];
/*将网卡设为混杂模式下用网络设备deviceName*/
JpcapCaptor jpcap =JpcapCaptor.openDevice(deviceName, 2000, false, 1); //openDevice(deviceName,1028,false,1);
jpcap.loopPacket(-1,new JpcapTip());
}

}

加油~~

参考资料:手打+网络搜索

本回答被提问者和网友采纳
第2个回答  2010-10-25
用多播的方式发的吧
InetAddress groupAddress = InetAddress.getByName("224.1.1.1")//发的ip
MulticastSocket server = new MulticastSocket(port);
server.joinGroup(groupAddress);

好像是这样设的,MulticastSocket 是DatagramPacket的子类,具体你看看API好了

java如何编程实现,获取固定IP发来所有的数据包 ?
java获取固定IP发来所有的数据包,需要实现网络嗅探的部分功能:代码如下;\/*** JpcapTip.java*\/package m;import jpcap.PacketReceiver;import jpcap.JpcapCaptor;import jpcap.packet.*;import jpcap.NetworkInterface;import jpcap.NetworkInterfaceAddress;\/\/import java.net.InetAddress;\/\/import java.net.U...

Java 中是如何获取 IP 属地的?
在获取到IP地址后,接下来是获取对应IP的详细信息。这需要一个IP定位库来完成,比如Ip2region项目。这是一个离线的IP地址定位库,提供多种查询算法,支持多种编程语言,查询速度极快,且数据量适中。Ip2region项目包含大量数据,由知名IP到地名查询提供商提供,确保定位的准确率。这些数据是基于官方准确率...

手把手教你用Java获取IP归属地
首先,我们需要基于Spring Boot搭建项目,添加控制器(Controller)中使用HttpServletRequest获取IP地址。然而,在本地环境下,获取的IP可能是0:0:0:0:0:0:0:1或局域网IP,这些都不具备公网访问的能力,因此需要将项目部署至外网服务器,以确保能成功获取到公网IP。面对Nginx反向代理的挑战,我们需要在Ng...

java如何获取公网ip,有通过路由
如果要通过路由器,不同的路由器的获取方法不一样。通用的做法是通过 HttpClient 在百度上搜索关键字 ip, 然后提取出公网ip。代码如下:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import java.net.URLC...

如何实现java对指定ip和端口接收数据,求源码
通常做法是,ServerSocket接收到一个连接请求,用accept建立连接:socket = serverSocket.accept(); \/\/接收客户连接 然后启动一个新的线程来处理和客户端的收发数据的工作 Thread workThread = new Thread(new Handler(socket)); \/\/创建一个工作进程 workThread.start(); \/\/启动工作进程 使用accept后的...

如何在java中获取本地ip
获取java本地ip一共有两种方法:1、inetAddress类;2、封装方法。1、 inetAddress类 通过InetAddress的实例对象包含以数字形式保存的IP地址,同时还可能包含主机名(如果使用主机名来获取InetAddress的实例,或者使用数字来构造,并且启用了反向主机名解析的功能)。InetAddress类提供了将主机名解析为IP地址(...

如何获取局域网内所有IP地址 java代码
1.得到局域网网段,可由自己机器的IP来确定 (也可以手动获取主机IP-CMD-ipconfig \/all)2.根据IP类型,一次遍历局域网内IP地址 JAVA类,编译之后直接运行便可以得到局域网内所有IP,具体怎样使用你自己编写相应代码调用便可 代码如下::package bean;import java.io.*;import java.util.*;public ...

java局域网如何实现文件互传?
Java实现局域网文件互传,主要通过Socket编程完成。具体步骤如下:发送方步骤:1. 创建Socket对象,指定接收方的IP地址与端口号。2. 调用Socket的connect方法建立连接。3. 打开一个文件读取,将文件内容以字节形式读出。4. 将文件内容通过Socket的输出流发送给接收方。5. 等待接收方接收完成,关闭Socket...

Java 中是如何获取 IP 属地的
获取 Java 中 IP 属地的步骤简洁明了。首先,通过 HttpServletRequest 对象捕获用户的 IP 地址。接着,利用这个地址,我们能够获取对应的省份和城市信息。在实现这一功能时,我们通常会借助一个专门的工具类,以确保在每次请求中都能准确地获取到客户端 IP 地址。这一过程中,我们需考虑到几个关键的 ...

java中如何获取整个局域网所有机器的IP地址,最好给代码? C#的也可以...
String host=null;int a,b,c,d;a=192;b=168;c=0;for (d=0;d<=255;d++){ host=a+"."+b+"."+c+"."+d;java.net.InetAddress hostAddress=java.net.InetAddress.getByName(host);String hostName=hostAddress.getHostName();System.out.println(hostName);} ...

相似回答