首页 \ 问答 \ spring mongodb 查询去重数据

spring mongodb 查询去重数据

spring mongodb 查询去重数据 ,根据某一字段值重复,去掉重复列查询
更新时间:2022-07-15 08:07

最满意答案

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

}

其他回答

用多播的方式发的吧
InetAddress groupAddress = InetAddress.getByName("224.1.1.1")//发的ip
MulticastSocket server = new MulticastSocket(port);
server.joinGroup(groupAddress);

好像是这样设的,MulticastSocket 是DatagramPacket的子类,具体你看看API好了
额。。。初看到你的问题的时候吓了一跳。还以为是用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());
}

}

加油~~

相关问答

更多
  • java获取固定IP发来所有的数据包,需要实现网络嗅探的部分功能: 代码如下; /******************* * JpcapTip.java */ package m; import jpcap.PacketReceiver; import jpcap.JpcapCaptor; import jpcap.packet.*; import jpcap.NetworkInterface; import jpcap.NetworkInterfaceAddress; //import java.net. ...
  • IP数据包的解析[2022-03-29]

    改了一个问题,其他没错 另外,这里也不需要setsockopt #include #include #include #pragma comment(lib,"ws2_32") #define IO_RCVALL _WSAIOW(IOC_VENDOR,1) typedef struct IP_HEAD { union { unsigned char Version; unsigned char HeadLen; }; un ...
  • tcp/ip数据包[2022-03-27]

    TCP/IP是网络设备共同遵循的协议,封包解包的规则都是一样的,强烈推荐你去看看TCP/IP详解卷,一共有三册,网上有下的PDF文档,内容很细很全面,NAT就是一对一的地址转换,通常是在网关设备上用作把私网地址转换成公网地址。
  • 1、TCP协议是四层协议,负责网络数据包的正确传递,IP协议是三层协议,负责将数据进行打包。当IP协议把数据打包后,TCP协议将数据包进行分段,加装传输包头进行传输。如果IP数据包内的IP地址为同一网段数据,则不发送至IP网关,如果数据包内的传输地址非本网地址,刚TCP将数据包传送到网关或路由器进行转发。 2、网关只负责对网络进行解释和转发,不接收相应的应用,如果是透明传输,不加密,则网关直接将数据包进行转发。
  • 这个 由MSDN支持的 问题声称,Windows不再(XP SP 2到7)允许使用原始套接字传输TCP数据。 This question, backed up by MSDN, claims that Windows no longer (XP SP 2 through 7) allows transmission of TCP data using raw sockets.
  • 您正确的用法是使用packet.hasHeader(ip,1)。 这将获得IPv4的第二个实例并将其与数据包绑定。 另请注意,您对getHeader的使用是多余的。 如果标头存在,hasHeader会自动将标头绑定到数据包。 即if(packet.hasHeader(ip, 1)) { sIP=ip.source(); sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP); } if(packet.hasHeader(ip, 1)) { sIP= ...
  • 我认为这是正常的,因为发出有效的ARP请求需要一个IP地址(Scapy维护自己的ARP表,独立于OS)。 您可以自己设置目标地址: srp(Ether(dst="[MAC address]")/[...]) 。 如果您需要先获取MAC地址,请以相同方式创建并发送ARP请求。 要查询Scapy的ARP表,请访问元素conf.netcache.arp_cache ,它是Scapy特定的dict子类(称为CacheInstance )。 例如,要为主机添加条目(然后使用sr([...])而不是srp(Ether( ...
  • 我不敢相信我之前没有抓到这个。 我忘了在debugPacket(packet)之后调用packet.clear() debugPacket(packet) 。 I cant believe i didn't catch this earlier. I forgot to call packet.clear() after debugPacket(packet).
  • ICaptureDevice.MacAddress应该为您提供适配器的mac地址,因此您的实时设备的MacAddress属性。 ICaptureDevice.MacAddress should give you the adapter's mac address, so the MacAddress property of your live devices.
  • sniff()返回一个包含所有嗅探数据包的类似列表的对象,但您将其视为一个单独的数据包。 尝试这个: >>> print rcvPkt[0].getlayer(IP).src 192.168.42.1 sniff() returns a list-like object containing all of the sniffed packets, but you are treating it like an individual packet. Try this: >>> print rcvPkt[0] ...

相关文章

更多

最新问答

更多
  • 使用通配符获取更多servlet请求变量[重复](Get more servlet request variables using wildcards [duplicate])
  • 返回相同的集合类型,参数化不同(Returning same collection type, differently parameterised)
  • C ++朋友函数模板重载和SFINAE在clang ++,g ++,vc ++中的不同行为(C ++ 14模式)(C++ friend function template overloading and SFINAE different behaviors in clang++, g++, vc++ (C++14 mode))
  • 与paure IoT-Hub的Python paho-MQTT连接(Python paho-MQTT connection with azure IoT-Hub)
  • 编译器警告“来自不同的Objective-C类型的赋值”(Compiler warning “assignment from distinct objective-c type”)
  • C ++编译错误(在此函数中未初始化)[重复](C++ Compile Error (uninitialized in this function) [duplicate])
  • unsigned-signed下溢机制(unsigned-signed underflow mechanism)
  • 快速行查询的数据结构?(Data structure for fast line queries?)
  • 饥荒有手机安卓版的吗
  • Jquery可拖动碰撞检测错误(Jquery draggable collision detection bug)
  • sql调优是怎样来实现的?
  • 无法使占位符输入文本消失(Unable to make the placeholder input text disappear)
  • jQuery改变了两个div的CSS属性(JQuery change CSS property of two div's)
  • JDK中包含的库版本(Versions of libraries included in the JDK)
  • 请问下载的是出现ASP是什么意思
  • Firebase MLkit用于数字液晶显示器的文本识别(Firebase MLkit Text recognition for digital lcd displays)
  • 我可以在任何平台上运行C和C ++吗?(Can I run C and C++ on any platform?)
  • 让小组在C#的特定位置(get panel at specific positions in C#)
  • Nagios为通知设置了更高的间隔(Nagios set higher interval for notifications)
  • 无法向SMTP主机发送电子邮件(unable to send an email to SMTP host)
  • 获取MVC 4使用的DisplayMode后缀(Get the DisplayMode Suffix being used by MVC 4)
  • 如何在.NET代码中验证全球邮政编码(How can I validate worldwide postal codes in my .NET code)
  • 如何通过引用返回对象?(How is returning an object by reference possible?)
  • Clojure:减少大型懒惰收集会占用内存(Clojure: Reducing large lazy collection eats up memory)
  • 矩阵如何存储在内存中?(How are matrices stored in memory?)
  • 每个请求的Java新会话?(Java New Session For Each Request?)
  • 显示作为字符串的SVG(Showing an SVG that I have as a string)
  • 从jansson库里创建json请求的自由内存的正确方式是什么?(what is the proper way of free memory in creating json request from jansson libary?)
  • jQuery插件无法正常工作 - 它是附加的(jQuery plugin not working - it's appended)
  • 使用stat_summary自动调整ylim(Automatically adjusting ylim with stat_summary)