编写广播数据类
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(); } }