• java:UDP广播发送与接收数据报实现


    编写广播数据类

    package com.zy.java.service;
    
    
    import java.io.*;
    import java.net.DatagramPacket;
    import java.net.InetAddress;
    import java.net.MulticastSocket;
    import java.net.UnknownHostException;
    
    /**
     * @author 
     * @date 2019/7/31 18:32
     */
    public class BroadcastService extends Thread {
        //获取目录下的二进制文件(.bat)
        private String url = System.getProperty("user.dir")+"\src\main\resources\data";
        private String IP = "224.23.55.14";
        private int port = 9898;
        InetAddress address = null;
        MulticastSocket socket = null;
    
    
        public static void main(String[] args) {
            BroadcastService service = new BroadcastService();
            service.start();
        }
    
        public BroadcastService() {
            try {
                address = InetAddress.getByName(IP);
                socket = new MulticastSocket(port);
                socket.setTimeToLive(1);
                socket.joinGroup(address);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void run() {
            get16byte();
        }
    
    
        public void get16byte(){
            File dir = new File(url);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            //获取目录下file集合
            File[] files = dir.listFiles();
            for (int i = 0; i < files.length; i++) {
                try {
                    DatagramPacket packet = null;
                    File binFile = new File(files[i].getPath());
                    DataInputStream dataIn = new DataInputStream(new FileInputStream(binFile));
                    StringBuffer hexString = new StringBuffer();
                    String str = "";
                    byte temp = 0;
                    int count = 0;
                    String counts = null;
                    for(int j = 0; j < binFile.length(); j++){
                        temp = dataIn.readByte();
                        str = Integer.toHexString(temp);
                        if (str.length() == 8) {
                            str = str.substring(6);
                        } else if (str.length() == 1) {
                            str = "0" + str;
                        }
                        hexString.append(str.toUpperCase());
                        if(hexString.length() % 16 == 0 && j < binFile.length()-1){
                            count++;
                            if(count < 10){
                                counts = "0"+count;
                                System.out.println(" --- 满16位输出["+counts+"] : "+hexString.toString()+" --- ");
                            }else{
                                System.out.println(" --- 满16位输出["+count+"] : "+hexString.toString()+" --- ");
                            }
                            byte[] buff = hexStringToByteArray(hexString.toString());
                            packet = new DatagramPacket(buff, buff.length, address, port);
                            socket.send(packet);
                            hexString.delete(0,hexString.length());
                            sleep(1000);
                        }
                        if(j == binFile.length()-1){
                            System.out.println(" --- 最后输出 : "+hexString.toString()+" --- ");
                            byte[] buff = hexStringToByteArray(hexString.toString());
                            packet = new DatagramPacket(buff, buff.length, address, port);
                            socket.send(packet);
                            sleep(1000);
                        }
                        str="";
                    }
                    dataIn.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
    
        public byte[] hexStringToByteArray(String hexString){
            hexString = hexString.replace(" ","");
            int len = hexString.length();
            byte[] bytes = new byte[len / 2];
            for(int i = 0;i < len; i+= 2){
                bytes[i / 2] = (byte)((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i+1), 16));
            }
            return bytes;
        }
    }

    编写广播接收类

    package com.zy.java.service;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.InetAddress;
    import java.net.MulticastSocket;
    import java.net.UnknownHostException;
    
    /**
     * @author 
     * @date 2019/7/30 09:40
     */
    //@RestController
    public class ListenInService extends JFrame implements Runnable, ActionListener {
    
        private static final char HexCharArr[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        //端口
        private static int port = 9898;
        //IP
        private static String IP = "224.23.55.14";
    
        private static InetAddress group = null;
        //开始按钮
        private JButton button_begin;
        //结束按钮
        private JButton button_stop;
        private JTextArea textArea_1;
    //    private JTextArea textArea_2;
        //线程
        private Thread thread;
        private MulticastSocket socket = null;
        private boolean flag = false;
    
        public static void main(String[] args) {
            ListenInService service = new ListenInService();
            service.setVisible(true);
        }
    
        public ListenInService(){
            setTitle("UDP实现接收广播数据报");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(200, 250, 350, 150);
            JPanel panel = new JPanel(new FlowLayout());
            button_begin = new JButton("开始接收");
            panel.add(button_begin);
            button_begin.addActionListener(this);
            button_stop = new JButton("停止接收");
            panel.add(button_stop);
            button_stop.addActionListener(this);
    
            getContentPane().add(panel, BorderLayout.NORTH);
    
            JPanel panel_1 = new JPanel(new GridLayout(1, 2));
            textArea_1 = new JTextArea();
            textArea_1.setLineWrap(true);
            panel_1.add(textArea_1);
            /*textArea_2 = new JTextArea();
            textArea_2.setLineWrap(true);
            panel_1.add(textArea_2);*/
    
            getContentPane().add(panel_1, BorderLayout.CENTER);
            thread = new Thread(this);
            validate();
            try {
                group = InetAddress.getByName(IP);
                socket = new MulticastSocket(port);
                socket.joinGroup(group);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == button_begin){
                if(!thread.isAlive()){
                    thread = new Thread(this);
                }
                thread.start();
                flag = false;
            }
            if(e.getSource() == button_stop){
                flag = true;
            }
        }
    
        @Override
        public void run() {
            String counts = null;
            int count = 0;
            while(!flag){
                count++;
                byte[] buff = new byte[16];
                DatagramPacket packet = null;
                packet = new DatagramPacket(buff, 0, buff.length);
                try {
                    socket.receive(packet);
                    byte[] bytes = packet.getData();
                    String value = byteArrToHex2(bytes);
                    value = value.substring(0,value.length()/2);
                    textArea_1.setText(" --- 实时接收内容 打印 :");
                    textArea_1.append("
    
    接收次数:"+count+"	"+value);
    InetSocketAddress address = (InetSocketAddress)packet.getSocketAddress();
    if(count < 10){ counts = "0"+count; System.out.println(" -- 来源IP["+address.toString()+"],接收值["+counts+"] : "+value+" --- "); }else{ System.out.println(" -- 来源IP["+address.toString()+"],接收值["+count+"] : "+value+" --- "); } } catch (IOException e) { e.printStackTrace(); } } } public String byteArrToHex(byte[] btArr){ char strArr[] = new char[btArr.length * 2]; int i = 0; for(byte bt : btArr){ strArr[i++] = HexCharArr[bt>>>4 & 0xf]; strArr[i++] = HexCharArr[bt & 0xf]; } return new String(strArr); } public String byteArrToHex2(byte[] btArr){ StringBuffer sb = new StringBuffer(btArr.length); for(int i = 0; i < btArr.length; i++){ sb.append(Integer.toString((btArr[i] & 0xFF) + 0x100, 16).substring(1).toUpperCase()); } return sb.toString(); } }
  • 相关阅读:
    翻译MDN里js的一些方法属性
    ajax相关
    我的面试错题
    写代码通用思路
    工厂模式
    cookie & session
    X-UA-Compatible设置IE浏览器兼容模式
    [转]IE6/IE7/IE8/IE9中tbody的innerHTML不能赋值的完美解决方案
    EasyUseCase 一款脑图转化 Excel 测试用例工具 (1.2 版本升级)
    XMind2TestCase:一个高效测试用例设计的解决方案!
  • 原文地址:https://www.cnblogs.com/nhdlb/p/13578262.html
Copyright © 2020-2023  润新知