UDP多人聊天室

news/2024/5/18 12:07:38 标签: udp, 网络协议, 网络

讲解的是TCP和UDP两种通信方式它们都有着自己的优点和缺点  这两种通讯方式不通的地方就是TCP是一对一通信  UDP是一对多的通信方式

UDP通信 主要的方向是一对多通信方式 UDP通信就是一下子可以通信多个对象,这就是UDP对比TCP的优势,UDP它的原理呢  就是开启服务端 然后客户端依次连接客户端  于TCP不同的是他不会一个一个跟客户端说而是跟微信群聊一样它在给这些客户端发送消息 它的缺点呢  服务端呢会发送消息给到客户端  但是有些客户端并不会接收到消息 或者没有看到消息  这样就是UDP的缺点 并不会保证全部人都能收到消息,就像老师在教室上课 老师在讲台上上课  总会有些同学低头玩手机 或者发呆 就会有人没有听到老师讲的知识,UDP对比于TCP的缺点,就是不能保证每一个人都能够接收到消息 ,但是优点就是可以一下子跟好多个对象进行通信,但是不能保证可靠度
 


package udp;
 
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
//广播  先运行
public class Notification  extends Thread{
	String weather = "节目预报:八点有大型晚会,请收听";//发送消息
	int port = 9898;//端口号
	InetAddress iaddress = null;
	MulticastSocket socket = null;//多点广播套接字
	
	Notification(){
		try {
			iaddress = InetAddress.getByName("224.255.10.0");//地址
			socket = new MulticastSocket(port);//实例化多点广播套接字
			socket.setTimeToLive(1);//指定发送范围是本地网络
			socket.joinGroup(iaddress);//加入广播组
		}catch(IOException e){
			e.printStackTrace();//输出异常信息
		}
	
	}
	public void run(){//run方法
		while(true) {
			DatagramPacket packet = null;//数据包
			byte data[]=weather.getBytes();//字符串消息的字节数组
			packet =  new  DatagramPacket(data,data.length,iaddress,port);//将数据打包
			System.out.println(weather);//控制台打印消息
			try {
				socket.send(packet);//发送数据
				sleep(3000);//让线程休眠3000毫秒
			}catch(IOException e){
				e.printStackTrace();
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
		}	
			}
	public static void main(String[]args) {
		Notification w =new Notification();
		w.start();//启动线程
	}
}
package udp;
 
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 javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
//接收  后运行
public class Receive extends JFrame implements Runnable, ActionListener {
	int port ;//端口
	InetAddress group =null;//广播组地址
	MulticastSocket socket = null;//多点广播套接字对象
	JButton inceBtn = new JButton("开始接收");
	JButton stopBtn = new JButton("停止接收");
	JTextArea inceAr = new JTextArea(10,10);//显示接收广播的文本域
	JTextArea inced = new JTextArea(10,10);
	Thread thread ;
	boolean stop = false;//定制接受信息状态
	
	public Receive () {
		setTitle("广播数据包");
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		thread = new Thread(this);
		inceBtn.addActionListener(this);//绑定按钮ince的单击事件
		stopBtn.addActionListener(this);//绑定按钮stop的单击事件
		inceAr.setForeground(Color.blue);//指定文本域中文字的颜色
		
		JPanel north = new JPanel();
		north.add(inceBtn);//将按钮添加到面板north上
		north.add(stopBtn);
		add(north,BorderLayout.NORTH);//将north放置在窗体的上部
		JPanel center = new JPanel();//创建面板对象center
		center.setLayout(new GridLayout(1,2));//设置面板布局
		center.add(inceAr);//将文本域添加到面板上
		center.add(inced);
		add(center,BorderLayout.CENTER);//设置面板的布局
		validate();//刷新
		port =9898;//设置端口号
		try {
			group = InetAddress.getByName("224.255.10.0");//指定接收地址
			socket = new MulticastSocket(port);//绑定多点广播套接字
			socket.joinGroup(group);//加入广播组
		}catch(IOException e){
			e.printStackTrace();//输出异常信息
		}
		setBounds(100,50,360,380);//设置布局
		setVisible(true);//将窗体设置为显示状态
	}
	public void run() {//run方法
		while (!stop) {
			byte data[] = new byte[1024];//创建缓存字节数组
			DatagramPacket packet = null;
			packet = new  DatagramPacket(data,data.length,group,port);//待接收的数据包
			try {
				socket.receive(packet);//接收数据包
				//获取数据包中的内容
				String message  = new String(packet.getData(),0,packet.getLength());
				inceAr.setText("正在接收的内容:\n"+message);//将接受内容显示在文本域中
				inced.append(message+"\n");//每条信息为一行
			}catch(IOException e ) {
				e.printStackTrace();//输出异常信息
			}
			
		}
	}
	public void actionPerformed(ActionEvent e) {//单机按钮ince出发时间
		if(e.getSource()==inceBtn) {
			inceBtn.setBackground(Color.red);//设置按钮颜色
			stopBtn.setBackground(Color.yellow);
			if(!(thread.isAlive())) {//如线程不处于“新建状态”
				thread = new Thread(this);//实例化Thread对象
			}
			thread.start();//启动线程
			stop = false;//开始接受信息
		}
		if(e.getSource()== stopBtn) {//单机按钮stop出发时间
			inceBtn.setBackground(Color.yellow);//设置按钮亚瑟
			stopBtn.setBackground(Color.red);
			stop = true;//停止接收信息
		}
	}
	public static void main(String[]args) {
		Receive rec = new Receive();
		rec.setSize(460,200);
	}
}


http://www.niftyadmin.cn/n/5270637.html

相关文章

java基础进阶之List和Set和Map

1、list List本身是一个接口,该接口继承自Collection接口,它有两个常用的实现子类ArrayList和LinkedList。从功能特性上来看,List是有序、可重复的单列集合,集合中的每个元素都有对应的顺序索引,我们可以通过该索引来访…

python小知识:argparse.ArgumentParser() 的常用参数解析

由于使用命令行启动python服务的时候,需要传入一些动态参数,所以就用到了argparse.ArgumentParser()解析器。 本文主要是记录了项目中使用argparse.ArgumentParser() 时,常用的一些参数。 1.导入argparse import argparse2.创建解析器 parse…

SQL进阶理论篇(十):数据库中的锁

文章目录 简介按照锁的粒度进行划分从数据库管理的角度进行划分从程序员的角度进行划分为什么共享锁会发生死锁?参考文献 简介 索引和锁,是数据库中的两个核心知识点。 索引的相关知识点,在之前的几章里我们已经介绍的差不多了。接下来我们…

检证一下 Open Interpreter 的效果,确实很强大

检证一下 Open Interpreter 的效果,确实很强大 0. 背景1. 验证内容2. 第一步验证能否读取3. 第二步验证能否计算 0. 背景 现在有一个需求参照的是 OpenAI 的 Code Interpreter,总所周知,要想使用 Code Interpreter 需要购买 GPT-4&#xff0…

基于ssm居家养老系统论文

居家养老系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了居家养老系统的开发全过程。通过分析高校学生综合素质评价管理方面的不足,创建了一个计算机管理居家养老系统的方案。文章介绍了居家…

服装管理系统 简单实现

服装管理系统 项目使用jsp servletmysql实现; 登陆注册 首页 首页显示服装信息 服装管理 1添加服装 2修改服装 3分页查询服装 4导出服装信息 5 导入服装信息 代码结构截图 百度网盘 链接:https://pan.baidu.com/s/1zfLHGMnrYd-JtnhzS5elYQ 提取码…

qt实现基本文件操作

先通过ui界面实现基本框架 接下来就要实现每个按键的功能了 我们先来实现新建的的功能,我们右键新建键,可以发现没有转到槽的功能,因此我们要自己写connect来建立关系。 private slots:void newActionSlot(); 在.h文件中加上槽函数。 conne…

HNU-数据库系统-实验1-数据定义/数据操纵

数据库系统 课程实验1数据定义/数据操纵 计科210X 甘晴void 202108010XXX 目录 文章目录 数据库系统 课程实验1<br>数据定义/数据操纵实验目的实验样例实验环境实验内容1.1 数据库定义1&#xff09;实验内容与要求2&#xff09;实验重难点3&#xff09;实验基础知识①模…