UDP网络程序设计思路(udp网络程序设计思路与实现)
chargingw 2024-09-08 02:49 8 浏览
UDP网络程序设计思路
相当于一个广场上通知事情的大喇叭,在宣传,但却不一定保证每个人都能听到消息;
主要掌握的构造方法
数据包:
DatagramPacket(byre[] buf ,int length,InetAddtess address,int port)
构造方法 包数据 包长度 目的地址 目的端口
数据包套接字:
DatagramSocket(int port,InetAddress addr)
构造方法 端口 ip地址
子类:
MulticastSocket extends DatagramSocket
joinGroup(InetAddress) //加入广播组;
leaveGroup(InetAddress)//离开广播组;
程序示例
udpserver
package udpserver;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class server extends Thread{//继承线程类,让不断发广播
int port = 9898;//端口
InetAddress group;//广播组地址
MulticastSocket socket;//创建多播数据包套接字
//进行套接字实例化
public server() {
//这里的地址范围224.0.0.0~239.255.255.255
try {
group=InetAddress.getByName("224.255.10.0");//指定广播组地址
socket = new MulticastSocket(port);//实例化多播数据包套接字
socket.joinGroup(group);//加入广播组
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
while(true) {
DatagramPacket packet;
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("HH:mm:ss");//定义时间格式
String message = "["+sf.format(date)+"]今天天气晴朗,你好啊!";
byte data[] = message.getBytes();
packet = new DatagramPacket(data,data.length,group,port);//创建数据包
try {
socket.send(packet);//发送出去数据包
Thread.sleep(1000);
System.out.println(message);
} catch (IOException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
server send = new server();
send.start();
}
}
udpclient
package udpclient;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
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;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
/**
*
* @author Administrator
* 这里创建clent 用于接收服务端UDP 广播情况
*/
public class client extends JFrame implements Runnable,ActionListener{
JButton ince = new JButton("start reseive:");//开始接收 按钮
JButton stop = new JButton("stop receive!");//停止接收按钮
JTextArea inceAre = new JTextArea(10,10);//显示接收广播提示
JTextArea inced = new JTextArea(10,10);//显示接收的广播
Thread thread;//创建Thread 对象,用来新开线程执行广播接收操作
boolean getMessage = true;//是否接收广播
int port = 9898;//端口
InetAddress group;//广播组地址
MulticastSocket socket;//创建多播数据包套接字
//构造方法
public client() {
super("broadcast");//设置窗体标题
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗体关闭方法
inceAre.setForeground(Color.BLUE);//指定提示文本域中文字颜色
JPanel north = new JPanel();//创建JPane对象
north.add(ince);//将按钮添加到north上
north.add(stop);
add(north,BorderLayout.NORTH);//将north设置在窗体的上部
JPanel center = new JPanel();//创建面板对象center
center.setLayout(new GridLayout(1,2));//设置面板布局
center.add(inceAre);//将文本添加到面板上
final JScrollPane scrollPane = new JScrollPane();
center.add(scrollPane);
scrollPane.setViewportView(inced);
add(center,BorderLayout.CENTER);//设置面板布局
thread = new Thread(this);//创建线程运行自己的run方法
//添加监听
ince.addActionListener(this);
stop.addActionListener(this);
validate();//重新验证容器苗中的组件,刷新组件
setBounds(100, 50, 360, 380);//设置布局
setVisible(true);//将窗体设置为显示状态
try {
group=InetAddress.getByName("224.255.10.0");//指定广播组地址
socket = new MulticastSocket(port);//实例化多播数据包套接字
socket.joinGroup(group);//加入广播组
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*
* @param args 主方法
*/
public static void main(String[] args) {
client recve = new client();//创建本类对象
recve.setSize(460, 300);//设置窗体大小
}
//创建两个抽象方法
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == ince) {
ince.setBackground(Color.red);
stop.setBackground(Color.yellow);
if(!thread.isAlive()) {//如果线程不是存活的状态
thread = new Thread(this);
getMessage = true;
}
thread.start();
}
if(e.getSource()==stop) {
ince.setBackground(Color.yellow);
stop.setBackground(Color.red);
getMessage = false;
}
}
public void run() {
while(getMessage) {
DatagramPacket packet;
byte data[] = new byte[1024];
packet = new DatagramPacket(data,data.length,group,port);
try {
socket.receive(packet);//读取数据包
String message = new String(packet.getData(),0,packet.getLength());//从数据包中读取数据
inceAre.setText("receiving data:"+message);
inced.append(message+"\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
相关推荐
- Compose基础-Side-effect(二)(compose in)
-
1.前言在Compose基础-Side-effect(一)中,我们学习了几个常用的Side-effect:LaunchedEffect和rememberCoroutineScope,以及关键字rem...
- MAC 10.14 安装教程-制作安装EFI文件
-
如果仅限于制作一份可以进入黑苹果安装界面的EFI文件,大家只要稍作了解即可。喜欢折腾的朋友可以自己动手试试。主要设置部分我都会在图中加红圈说明。============================...
- Java14的新特性(质量是指客体的一组固有特性组织应满足的要求的程度,以下不属于)
-
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java1...
- 全新版Jetpack进阶提升,系统性落地短视频App(完结)
-
xia仔ke:quangneng.com/2342/全新版Jetpack进阶提升:系统性落地短视频App开发指南在移动应用开发领域,短视频应用凭借其丰富的互动性和娱乐性,吸引了大量用户。为了构建一个高...
- C 语言源程序文件扩展名及相关知识详解
-
本文就来聊一聊C语言源程序文件拼接后生成的文件扩展名是什么?,以及C++源程序文件扩展名对应的知识点是什么。希望对大家有所帮助,别忘了收藏本站哦。在Linux平台上,C语言源代码文件一般以.c为扩展名...
- c语言从头开始(三:编译器工作原理)
-
c语言从头开始(三:编译器工作原理)------------------以gcc编译器为例子,编译实际上总共经历了四个阶段预处理--->编译--->汇编--->链接1.预处理预处理就...
- 编译器 GCC 和 Clang 有什么区别?
-
Clang是一个C语言、C++、Objective-C语言的轻量级编译器,遵循BSD协议。Clang编译速度快、内存占用小、兼容GCC等一些优秀的特点使得很多工具都在使用它。今天就来谈谈Clang和G...
- Meta发布LLM编译器 称将改变我们的编程方式
-
Meta发布了Meta大型语言模型(LLM)编译器,这是一套强大的开源模型,旨在优化代码并彻底改变编译器设计。这项创新有望改变开发人员优化代码的方式,使代码优化更快、更高效、更具成本效益。在将大型语...
- 汇编语言之寄存器(汇编语言寄存器清零指令)
-
1、汇编语言的种类8086汇编(16位)X86汇编(32位)X64汇编(64位)ARM汇编(嵌入式,移动设备)......2、X64汇编X64汇编根据编译器的不同,有2种书写格式:intel和AT&...
- 前端笔记:JS 中 if / if……else……替换方式
-
说说烂大街的if/if...else...,程序中用得最多的流程判断语句。对着曾经满屏的if/if...else...,心想能不能搞点事情,折腾点浪花浪里呀浪。对顶着“这个需求很简单,怎么实现我不管,...
- JS 替换字符串中的文字内容(js 替换字符串中的文字内容是什么)
-
letsrt='helloword'srt.replace('hello','')第一个''为需求替换的内容第二个...
- excel中常用的快捷键Ctrl?H 替换的四种常用使用方法教程
-
Ctrl+H:替换的四种使用技巧。Hello,今天来学习Ctrl+H替换的几种用法。·先来看第一种,搭配通配符星号*来替换数据。这里的星号是通配符,它可以代表任何值,而且没有位数的限制...
- 在 JavaScript 中替换所有指定字符 3 种方法
-
在JS没有提供一种简便的方法来替换所有指定字符。在Java中有一个replaceAll(),replaceAll(Stringregex,Stringreplacement))方法...
- 查找替换的6种典型用法,全在此文,速度围观哦
-
查找替换,应该是Excel中很常见的操作了,但替换之后,并不能得到自己想要的效果,如下图:从示例中可以看出,目的是将“月薪”为0的信息替换为“待发放”,但结果却是将“月薪”中含有“0”的值全部替换为了...
- 「JS 逆向百例」W店UA,OB反混淆,抓包替换CORS跨域错误分析
-
关注微信公众号:K哥爬虫,持续分享爬虫进阶、JS/安卓逆向等技术干货!声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均...
- 一周热门
- 标签列表
-
- 端口被占用 (84)
- 代码转换 (76)
- ios测试工具 (79)
- require_once (89)
- oracle11g (88)
- oracleparameter (74)
- sessionscope (79)
- asynctask (90)
- oracle创建用户 (78)
- ts文件 (79)
- go microsoft com (75)
- plsql developer 64位 (74)
- 重复数据删除 (77)
- threadlocal (90)
- settimeoutinterval (90)
- weakreference (78)
- adb 命令 (74)
- ajax (76)
- wordpress安装 (77)
- excel vlookup (80)
- widget (77)
- ps复制图层快捷键 (108)
- outofmemory (88)
- divcss (74)
- iis安装教程 (78)