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();
}
}
java:UDP广播发送与接收数据报实现的更多相关文章
- java udp 广播
		
原文链接: http://blog.csdn.net/yudajun/article/details/8477149 udp 是一种网络通信协议,不需要客户端和服务器端建立连接即可进行通讯功能.相对于 ...
 - [java,2018-01-16] HttpClient发送、接收 json 请求
		
最近需要用到许多在后台发送http请求的功能,可能需要发送json和xml类型的数据. 就抽取出来写了一个帮助类: 首先判断发送的数据类型是json还是xml: import org.dom4j.Do ...
 - Android杂谈--HTC等手机接收不到UDP广播报文的解决方案
		
最近遇到个问题,在android手机上发送UDP报文的时候,HTC等机型(测试用HTC new one)接收不到广播报文,而其他的samsung, huawei, xiaomi, nexus等等均没有 ...
 - udp协议的数据接收与发送的代码
		
我想基于lwIP协议中的UDP协议,用单片机做一个服务器,接受电脑的指令然后返回数据.以下是我的代码 /************************************************ ...
 - 通过UDP广播实现Android局域网Peer Discovering
		
本文是对个人笔记中内容的整理,部分代码及图片来自互联网,由于不好找到原始出处,所以未加注明. 如有痛感,联系删除. 本文将介绍以下知识点: TCP与UDP的区别: 单播.多播.广播: Java中实现U ...
 - 给Hi3518e的Uboot添加UDP广播收发功能
		
基于个人兴趣,决定实现一个和方案公司提供的uboot收发广播的功能.记录笔记如下. SDK版本:Hi3518E_V100R001C01SPC081 1. 由于我手头的板子的Phy是RMII模式,因此先 ...
 - Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据
		
1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源 UDP协议接 ...
 - 项目总结22:Java UDP Socket数据的发送和接收
		
项目总结22:Java UDP Socket数据的发送和接收 1-先上demo 客户端(发送数据) package com.hs.pretest.udp; import java.io.IOExcep ...
 - Udp广播的发送和接收(iOS + AsyncUdpSocket)下篇
		
接上篇C#的Udp广播的发送和接收 http://www.cnblogs.com/JimmyBright/p/4637090.html ios中使用AsyncUdpSocket处理Udp的消息非常方便 ...
 
随机推荐
- rpm包名详解-rpm命令使用方法
			
linux软件包管理-rpm mount # 挂载 1.将光盘镜像插入光驱 2.创建挂载目录 mkdir /guangqu 3.挂载到/guangqu [root@gong ~]# mount /de ...
 - SQL注入和XSS攻击
			
SQL注入 定义:黑客通过在请求的数据中填入特殊字符,影响服务器数据库操作程序正常执行,从而达到攻击的目的. 形式: 拼接SQL: 登录验证:前台输入 username:yan password:12 ...
 - docker-ce 安装
			
配置源 确认版本 添加镜像加速器 https://docs.docker.com/engine/release-notes/19.03/ for centos wget -O /etc/yum.rep ...
 - 关于Unity启动调用Android_id问题排查
			
问题:Unity启动时获取了设备信息,其中包括Android_id 以下是在androidstudio中的log,使用Xposed的LoginHook看到Unity启动时获取了android_id信息 ...
 - Navigation 实现不同fragment之间的view的共享(含动画过渡)
			
以imageView的共享举例 两个fragment都要有各自的imageview视图,id可以不同,但transitonName一定要相同, 都要指定相同的src 例如: fragment A &l ...
 - Django(45)drf序列化类的使用(Serializer)
			
前言 上一篇文章我们讲述了序列化,这篇就带大家一起来实现以下序列化 Serializer 我们使用序列化类Serializer,我们来看下源码结构,这里推荐使用pycharm左边导航栏的Structu ...
 - GO学习-(24) Go语言操作Redis
			
Go语言操作Redis 在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用. Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据 ...
 - python操作mongodb根据_id查询数据的实现方法
			
python操作mongodb根据_id查询数据的实现方法 python操作mongodb根据_id查询数据的实现方法,实例分析了Python根据pymongo不同版本操作ObjectId的技巧, ...
 - 使用regulator_get时的一个小注意事项
			
Linux kernel 使用 regulator 框架来管理电源,比如 PMIC 芯片上常见的LDO.使用 regulator 的常规流程如以下代码所示: void set_vbus_voltage ...
 - Reactive 理解 SpringBoot 响应式的核心-Reactor
			
Reactive 理解 SpringBoot 响应式的核心-Reactor bestcoding 2020-02-23 17:26:43 一.前言 关于 响应式 Reactive,前面的两篇文章谈了不 ...