顶部左侧内容
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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/安卓逆向等技术干货!声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均...