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() {
// 获取所有可用网卡列表
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
NetworkInterface eth0 = null;
while( interfaces.hasMoreElements() ) {
eth0 = interfaces.nextElement();
if( eth0.getName().equals("eth0") ){
break; // 遍历所有网卡设备,找到自己的目标后,break退出
}
}
try{
// IP:组播地址 String格式
// Port:组播端口 int格式
address = InetAddress.getByName(IP); socket = new MulticastSocket(port); socket.setTimeToLive(1); socket.joinGroup(new InetSocketAddress(address, port), eth0); } 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("\n\n接收次数:"+count+"\t"+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(); } }

 

posted @ 2020-08-28 16:26  怒吼的萝卜  阅读(1848)  评论(0编辑  收藏  举报