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的消息非常方便 ...
随机推荐
- Python 简单的龟鱼游戏
游戏编程:按一下要求定义一个乌龟类和鱼类并尝试编程 假设游戏场景为范围(x,y)为 0<=x<=10,0<=y<=10 游戏生成1只乌龟和10条鱼 他们的移动方向均随机 乌龟的 ...
- Log4j 配置多个 Logger
引言 Log4j 是 Java 的主流日志框架,通过灵活的配置可以提供各种类型的日志服务. 在使用 Log4j 进行实际项目开发的过程中,有时不想使用 rootLogger 记录器,把所有的日志都输出 ...
- elk搜集日志,实现logstash根据message中结构不同动态创建索引并扩展功能,区分message中json和非json数据简单方式
搜集日志,但是框架本身也会打印很多日志是字符串的.我们自己希望的日志用json,但是又需要json字段可以扩展,logstash收集日志后都放在了message字段中,我们自定义打印的是json串,s ...
- 在安装python 第三方库时遇到【WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, st】问题
在命令执行窗输入: pip install Pyinstaller -i http://pypi.douban.com/simple --trusted-host pypi.douban.com (其 ...
- openresty 学习笔记三:连接redis和进行相关操作
openresty 学习笔记三:连接redis和进行相关操作 openresty 因其非阻塞的调用,令服务器拥有高性能高并发,当涉及到数据库操作时,更应该选择有高速读写速度的redis进行数据处理.避 ...
- CVPR2020论文解析:视频分类Video Classification
CVPR2020论文解析:视频分类Video Classification Rethinking Zero-shot Video Classification: End-to-end Training ...
- OneFlow 并行特色
OneFlow 并行特色 在 Consistent 与 Mirrored 视角中,已经知道 OneFlow 提供了 mirrored 与 consistent 两种看待分布式系统的视角,并且提前知道了 ...
- MindArmour差分隐私
MindArmour差分隐私 总体设计 MindArmour的Differential-Privacy模块,实现了差分隐私训练的能力.模型的训练主要由构建训练数据集.计算损失.计算梯度以及更新模型参数 ...
- NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库
NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库 Leveraging the Hardware JPEG Decoder and NVIDIA nvJPEG Lib ...
- 错误档案1:Eclipse自动生成swing窗体代码报错
目录 前言 错误信息 解决方法 结论 前言 大家好呀,我是 白墨,一个热爱学习与划水的矛盾体. 昨天为了图方便,使用MyEclipse中的swing功能画界面,画完以后发现无法运行,查看源代码发现全报 ...