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

高手指点:我想实现获取某个固定IP发来的所有的数据包,不管是那个端口发来的都要能得到,java编程如何实现?谢谢!!!!!我主要是不知道怎么写监听端的程序,那个IP的数据... 高手指点:我想实现获取某个固定IP发来的所有的数据包,不管是那个端口发来的都要能得到,java编程如何实现?谢谢!!!!!
我主要是不知道怎么写监听端的程序,那个IP的数据发往我的电脑的端口是未知的,高手指点,小弟高分献上!!!!
展开
 我来答
百度网友8a2005d
推荐于2016-03-16 · 知道合伙人互联网行家
百度网友8a2005d
知道合伙人互联网行家
采纳数:121 获赞数:1719
研究生期间做数据挖掘工作。在公司实习一年以上。

向TA提问 私信TA
展开全部

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());
}

}
popantx5CgP
推荐于2018-03-10 · TA获得超过176个赞
知道小有建树答主
回答量:106
采纳率:0%
帮助的人:115万
展开全部
额。。。初看到你的问题的时候吓了一跳。还以为是用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());
}

}

加油~~

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

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
patrick002
2010-10-25 · TA获得超过225个赞
知道答主
回答量:148
采纳率:0%
帮助的人:108万
展开全部
用多播的方式发的吧
InetAddress groupAddress = InetAddress.getByName("224.1.1.1")//发的ip
MulticastSocket server = new MulticastSocket(port);
server.joinGroup(groupAddress);

好像是这样设的,MulticastSocket 是DatagramPacket的子类,具体你看看API好了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式