java中模拟UDP发包

原始数据是从Linux服务器上特定端口抓取的采集卡发送给服务器的UDP包,在Linux上以pcap文件进行存储,我们使用java模拟采集卡发包的方式把这些文件里的数据等于是再发送一遍。
看代码:
先导包:

<dependency>
  <groupId>io.pkts</groupId>
  <artifactId>pkts-core</artifactId>
  <version>3.0.7</version>
</dependency>
public static void main(String[] args) throws IOException, InterruptedException {
    	String path = "D:\\360MoveData\\Users\\Administrator\\Desktop\\abis";
    	String hostName = "127.0.0.1";
    	int port = 40000;
        File files = new File(path);
        File[] fs = files.listFiles();
            for (File f : fs) {
                System.out.println("pcap文件" + f + "发往" + hostName + ":" + port);
                Thread.sleep(1000);
                System.out.println("开始发送UDP");
                PcapParser.parser(f, hostName, port);
            }
            System.out.println("----------------------发送完毕-----------------------");
    }
public class PcapParser {
    private static Logger logger = LoggerFactory.getLogger(PcapParser.class);

    public static void parser(File file, final String hostName, final int port) throws IOException {
        final Pcap pcap = Pcap.openStream(file);

        pcap.loop(new PacketHandler() {
            @Override
            public boolean nextPacket(final Packet packet) throws IOException {
                if (packet.hasProtocol(Protocol.IPv4)) {
                    IPPacket ipv4 = (IPPacket) packet.getPacket(Protocol.IPv4);
                    if (ipv4.hasProtocol(Protocol.UDP)) {
                        TransportPacket udpPacket = (TransportPacket) ipv4.getPacket((Protocol.UDP));
                            if (udpPacket.getPayload() != null) {
                                try {
                                    Thread.sleep(10);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                UdpSend.send(hostName, port, udpPacket.getPayload().getArray());
                            }
                    }
                }

                return true;
            }
        });
    }

    public static String bytesToHexString(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder("");
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
            stringBuilder.append(" ");
        }
        return stringBuilder.toString();
    }
}
public class UdpSend {
    private static Logger logger = LoggerFactory.getLogger(UdpSend.class);

    public static void send(String hostName, int port, byte[] data) throws IOException {
        UdpSend.logger.info(Arrays.toString(data));
        /*
         * 实现UDP协议的发送端:
         *     实现封装数据的类 java.net.DatagramPacket 将你的数据包装
         *     实现数据传输类    java.net.DatagramSocket 将数据包发出去
         *
         *    实现步骤:
         *        1.创建DatagramPacket对象,封装数据,接收的地址和端口
         *        2.创建DatagramSocket对象,
         *        3.调用DatagramSocket类的方法send,发送数据包
         *        4.关闭资源
         *
         *    DatagramPacket构造方法:
         *        DatagramPacket(byte[] buf,int length,InetAddress address,int port)
         *
         *    DatagramSocket构造方法:
         *        DatagramSocket()空参数
         *        方法:send(DatagramPacket d)
         *
         *
         */

        //创建数据包对象,封装要发送的数据,接受端IP,端口
        //创建InetAddress对象,封装自己的IP地址
        InetSocketAddress net = new InetSocketAddress(hostName, port);
        DatagramPacket packet = new DatagramPacket(data, data.length, net);
        //创建DatagramSocket对象,数据包的发送和接受对象
        DatagramSocket socket = new DatagramSocket();
        //调用ds对象的方法send,发送数据包
        socket.send(packet);
        socket.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了数据报文式的传输,速度快、效率高。在Java,可以使用java.net包来实现UDP通信。 在Java实现UDP通信源码的关键步骤包括创建DatagramSocket对象和DatagramPacket对象、发送数据和接收数据等。 首先,我们需要创建一个DatagramSocket对象来表示UDP套接字,并指定一个端口号。例如: ```java DatagramSocket socket = new DatagramSocket(8888); ``` 然后,我们可以创建一个DatagramPacket对象,用来存储发送和接收的数据。例如: ```java byte[] sendData = "Hello, UDP".getBytes(); InetAddress address = InetAddress.getByName("127.0.0.1"); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, 8888); ``` 接下来,我们就可以使用DatagramSocket对象来发送数据和接收数据了。发送数据的方法是send(),接收数据的方法是receive()。例如: ```java // 发送数据 socket.send(sendPacket); // 接收数据 byte[] receiveData = new byte[1024]; DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); socket.receive(receivePacket); String receiveMessage = new String(receivePacket.getData(), 0, receivePacket.getLength()); System.out.println("接收到的数据:" + receiveMessage); ``` 最后,需要注意在使用完DatagramSocket对象后需要关闭它,释放资源。例如: ```java socket.close(); ``` 以上就是在Java实现UDP通信的基本源码,通过DatagramSocket和DatagramPacket对象的使用,可以实现UDP协议的数据发送和接收操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值