Java网络编程 - 基于UDP协议 实现简单的聊天室程序

Java课程设计——聊天室 本项目为基于socket的网络编程,具体需要实现C/S模式的聊天程序,主要实现功能为多人在线聊天,两人之间的私聊,并实现发送文件等功能,该项目主要使用了Java语言,Java丰富的库类满足了网络化,多线程和面向对象系统的需要同时因为通信系统一般由客户端和服务端连股份组成,故采用了C/S模式,socket简称套接字,用于实现客户端和服务端之间的连接,而账户注册的信息则储存在Mysql数据库中。聊天室最上方为使用用户,主要为三个窗口,在线列表,聊天区,输入区,并且可以实现更换聊天背景的功能。 阅读详情

最近比较闲,一直在抽空回顾一些Java方面的技术应用。

今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序。

现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆。

先看一下效果:

实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理。

“聊天室001”的用户,小红和小绿相互聊了两句,“聊天室002”的小黑无人理会,在一旁寂寞着。


看一下代码实现:


1、首先是消息服务器的实现,功能很简单:

  • 将客户端的信息(进入了哪一个聊天室等)进行登记;
  • 构造UDP协议套接字对象,接受各个客户端发送的消息;
  • 解析消息内容,将聊天信息推送回对应聊天室的各个客户端;
package com.tsr.simplechat.receive_server;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.HashMap;

import com.google.gson.Gson;
import com.tsr.simplechat.bean.MessageEntity;
import com.tsr.simplechat.client.ChatClient;

//聊天服务器
public class ChatServer extends Thread {
	// 程序占用端口号
	private static final int PORT = 10000;
	// 消息接受套接字对象
	private static DatagramSocket server = null;
	// 字典对象(Key:聊天室ID,Value:该聊天室下的客户端用户集合);
	private static HashMap<String, ArrayList<ChatClient>> groups = new HashMap<String, ArrayList<ChatClient>>();

	// 构造器
	public ChatServer() {
		try {
			// 消息接受套接字对象的构造初始化
			server = new DatagramSocket(PORT);
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}

	// 注册聊天室新登录用户
	public static void logInGroup(String groupID, ChatClient client) {
		// 通过聊天室ID,获取该聊天室的所有在线用户
		ArrayList<ChatClient> clients = groups.get(groupID);
		if (clients == null) {
			clients = new ArrayList<ChatClient>();
		}
		// 将此次进入聊天室的用户登记
		clients.add(client);
		// 更新聊天室信息
		groups.put(groupID, clients);
	}

	// 循环接收消息
	@Override
	public void run() {
		while (true) {
			receiveMessage();
		}
	}

	private void receiveMessage() {
		// UDP数据包
		byte[] buf = new byte[1024];
		DatagramPacket packet = new DatagramPacket(buf, buf.length);
		while (true) {
			try {
				// 接受数据包
				server.receive(packet);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			// 解析数据包,获取聊天信息
			String content = new String(packet.getData(), 0, packet.getLength());

			// 通过第三方包解析json数据
			Gson gson = new Gson();
			MessageEntity me = gson.fromJson(content, MessageEntity.class);

			// 解析消息内容,通过聊天室ID,获取该聊天室的所有在线用户
			ArrayList<ChatClient> clients = groups.get(me.getGroupId());

			// 将接收到的消息推送回该聊天室的各个用户
			for (ChatClient client : clients) {
				client.pushBackMessage(me);
			}
		}
	}
}

2、客户端程序,依然很简单:
  • 简单的定义客户端聊天室界面。
  • 构造消息发送套接字对象。
  • 获取聊天信息框的内容,发送到服务器。
package com.tsr.simplechat.client;

import java.awt.Button;
import java.awt.Event;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import com.tsr.simplechat.bean.MessageEntity;
import com.tsr.simplechat.receive_server.ChatServer;

//客户端程序
public class ChatClient extends Frame {
	private static final long serialVersionUID = 1L;
	// 聊天室ID
	private String groupID;
	// 客户端用户名
	private String clientName;
	// 客户端消息发送服务套接字
	private DatagramSocket msg_send;
	// 服务端口
	private final int PORT = 10000;
	// 服务器IP地址
	private InetAddress ip;

	// 客户端控件
	TextField tf = new TextField(20);
	TextArea ta = new TextArea();
	Button send = new Button("send");

	// 客户端构造器
	public ChatClient(String groupID, String clientName) {

		super("聊天室:" + groupID + "/" + clientName);
		this.clientName = clientName;
		this.groupID = groupID;
		// 设置客户端界面样式
		add("North", tf);
		add("Center", ta);
		add("South", send);
		setSize(250, 250);
		show();
		// 聊天相关服务器初始化
		init();

		// 监视器
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				// 关闭消息发送服务
				msg_send.close();
				// 关闭客户端程序
				dispose();
				System.exit(0);
			}
		});

	}

	// 聊天相关服务器初始化
	private void init() {
		// 注册当前用户及所在聊天室信息注册到服务器
		ChatServer.logInGroup(groupID, this);
		try {
			// 初始化消息发送套接字对象
			msg_send = new DatagramSocket();
			// 指定消息服务器
			try {
				ip = InetAddress.getByName("127.0.0.1");
			} catch (UnknownHostException e) {
				System.out.println("未知的主机异常..");
			}
		} catch (SocketException e) {
			System.out.println("套接字连接异常..");
		}
	}

	// 消息发送按钮时间监听
	public boolean action(Event evt, Object arg) {
		if (evt.target.equals(send)) {
			try {
				// 获取输入内容
				String content = tf.getText();
				// 发送消息
				send_message(content);
				// 清空聊天框
				tf.setText(null);
			} catch (Exception ioe) {
				System.out.print(ioe.getMessage());
			}
		}
		return true;
	}

	// 消息发送
	private void send_message(String content) {
		// 消息格式化(json格式)
		String message = messageFormat(content);
		// 将消息封装成UDP数据包
		byte[] buf = message.getBytes();
		DatagramPacket packet = new DatagramPacket(buf, buf.length, ip, PORT);

		try {
			// 通过UDP协议发送消息
			msg_send.send(packet);
		} catch (IOException e) {
			System.out.println("IO异常..");
		}
	}

	// 消息格式化
	private String messageFormat(String content) {
		StringBuffer buffer = new StringBuffer();
		buffer.append("{\"groupId\":").append("\"").append(groupID).append(
				"\",");
		buffer.append("\"userName\":\"").append(clientName).append("\",");
		buffer.append("\"text\":\"").append(content).append("\"}");

		return buffer.toString();

	}

	// 从服务器获取当前聊天室最新消息(回调..)
	public void pushBackMessage(MessageEntity me) {
		ta.append(me.getUserName() + ":" + me.getText());
		ta.append("\n");

	}
}

3、消息实体类
主要就是用于将消息封装成对象,包含:聊天室ID、消息发送者昵称,消息内容。使用json格式解析。

package com.tsr.simplechat.bean;

//消息实体
public class MessageEntity {
	private String groupId;
	private String userName;
	private String text;

	public String getGroupId() {
		return groupId;
	}

	public void setGroupId(String groupId) {
		this.groupId = groupId;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}

}

4、OK,到了这里就基本搞定了,建立一个测试类。
  • 开启消息服务器。
  • 开启三个客户端,其中两个进入“聊天室001”,另一个进入“聊天室002”。
import com.tsr.simplechat.client.ChatClient;
import com.tsr.simplechat.receive_server.ChatServer;

public class Test {
	public static void main(String[] args) {
		ChatServer r = new ChatServer();
		r.start();
		
		ChatClient c1 = new ChatClient("001", "小红");
		ChatClient c2 = new ChatClient("001", "小绿");
		ChatClient c3 = new ChatClient("002", "小黑");
	}
}


DRAM里rank、bank、device到底什么关系?一文讲透内存颗粒的核心层次 从内存条的基本组成讲起,DRAM颗粒(device)是存储数据的物理芯片,而rank和bank则是决定内存并行性能的关键逻辑结构。理解这三者的层级关系,是看懂内存条参数、排查内存识别异常、选型服务器内存的基础。文章从实际工程角度解析数据位宽与rank组成规则,以及bank交错对带宽的影响,并结合SPD信息与颗粒编号的读取方法,帮助你在装机、调优时快速判断内存条等级。无论是普通桌面内存还是服务器RDIMM,掌握rank和bank的逻辑,就能看懂“2R x8”等标注背后的真实含义。 阅读详情

相关推荐

Java网络编程——UDP聊天室(可能是全网最良心的聊天室了吧)

Java网络编程——UDP聊天室(1) 自从将要考试以来就没时间写过文章了,终于熬到了放假,闲着没事干就和小伙伴一起写了个聊天室玩玩。 本来是打算用TCP来作为通信协议的,但是呢,我这么菜,就换成简单的UDP通信协议了。 闲话就先说到这里。正文要紧。 UDP协议的基础内容: <from 百度百科> 算了我还是太懒了,直接附上链接吧: 传送门 UDP的基础类: 话不多说直接贴代码: ...

小小白的成长之路 1850

Java实现简单聊天室【含源码】

文章目录1. 前言2. 成果演示3. 消息如何传送?4. 多线程体现在哪些地方?① 服务器的各条Socket② 客户端的接收功能5. 各功能实现①用户账号密码数据库② 如何查看当前在线人数③ 如何实现私聊实现离线留言④ 如何实现群发⑤ 如何实现退出客户端6. 源码QQServer项目common包1. Message.java2. MessageType.java3. User.java4. Utility.javamain包1. QQServer.java【服务器主函数】server包1. ManageS

Infinity_and_beyond的博客 3万+

利用Java网络编程实现简单聊天室

最近学到了Java的网络编程,对TCP协议以及UDP协议有了一些初步的认识,现在尝试使用TCP协议建立一个简单的多人聊天室,去实现多人在线聊天。 以下是具体实现思路(受某位老师启发…): 经过最初的学习,我们知道TCP协议是在两台计算机之间建立连接,然后可以把数据当作双向字节流进行交换, 以便达到传输的目的。但是这样只能达到双人聊天(私聊)的效果,而聊天室的特点在于某一个客户端发出的消息,在聊天...

Wang_YuHeng的博客 1678

Java课程设计——聊天室(个人博客)202203200033

一、个人负责模块 工具包,实现了服务器和客户端的请求和回应,文件和信息的传输,和对用户信息的储存和传输 二、功能框架图 三、个人任务简述 我的主要任务是为客户端和服务器的交互提供方法 1.客户端向服务器发出请求 Request.java package common.model.entity; import java.io.Serializable; import java.util.HashMap; import java.util.Map; public class Re

sunsea0729的博客 758

Java实现的UDP聊天程序

首先,我们需要创建一个UDP服务器端和一个UDP客户端。服务器端将监听指定的端口,接收来自客户端的消息,并将其广播给所有已连接的客户端。客户端将发送消息到服务器,并接收服务器广播的消息。类来创建一个UDP socket,并通过循环不断接收来自客户端的消息。当接收到消息后,服务器将消息广播给所有已连接的客户端。类创建一个UDP socket,并通过键盘输入发送消息到服务器。然后,客户端接收服务器广播的消息并进行打印。现在,你可以在多个客户端之间进行消息传递,体验基本的UDP聊天功能。希望这个示例对你有帮助!

ByteKnight的博客 295

java编程基于UDP的简单聊天室

用Java写的基于UDP无连接的简单图形界面聊天程序,可实现内网或外网运行本程序计算机的文本通信聊天,可群聊

Java网络编程入门

文章目录网络编程什么是计算机网络想要达到这个效果需要什么:**小结:**端口Port通信协议三次握手,四次挥手UDP:发短信TCP实现聊天服务器TCP文件上传实现初识TomcatUDP聊天实现URL下载网络资源 网络编程 什么是计算机网络 概述: 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。 地球村:你在武汉,你一个美国的朋友 网络编程的目的:无线电台:传播交流信息,数

lbw18的博客 277

微信小程序获取用户手机号全流程实战(附完整代码)

本文详细介绍了微信小程序获取用户手机号的全流程实战,包括前端授权、后端解密及安全合规要点。通过传统授权按钮和新版手机号快速验证组件两种方案,帮助开发者高效实现功能,并附完整代码示例。重点解析了微信小程序接口的使用技巧和常见问题解决方案,确保数据安全与用户体验。

weixin_29280219的博客 567

Java网络编程

Java网络编程基础知识

weixin_42694511的博客 409

【原创工具 | OpenCV-CamCalib】一个基于 OpenCV 的自动化相机数据采集和标定程序

一个基于OpenCV的自动化相机数据采集和标定程序。系统内置相机地址默认为 0。

XavierJ的博客 2696

开关电源PCB安规设计避坑指南:从光耦开槽到变压器挡墙,这些细节决定认证成败

本文深入解析开关电源PCB安规设计中的关键细节,包括光耦开槽、变压器挡墙工艺等12个致命要点。通过实际案例和工艺参数表,揭示如何避免认证失败,特别强调爬电距离和电气间隙的精确控制,助力工程师提升产品安全性和认证通过率。

weixin_42548893的博客 202

Java基础——网络编程(二)

一、套接字 Socket 网络驱动程序提供给应用程序编程的接口和一种机制,可以比喻成一个港口码头 应用程序只要把货放在这,就算完成了货物的运送。它在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自已对应的IP 和 Port。 Socket是 java 中网络编程的类 , 位于java.net包中。 ---- DatagramSocket //用于UDP通迅 ---- Serve...

weixin_30652271的博客 69

SICK LMS111激光雷达数据解析实战:从原始帧到三维点云的完整流程

本文详细解析了SICK LMS111激光雷达从原始数据帧到三维点云的完整处理流程,包括数据帧结构解析、坐标转换、点云可视化及性能优化技巧。通过实战代码示例,展示了如何高效处理激光雷达数据,并应用于动态物体检测、地面分割等工业场景,为AGV和服务机器人开发者提供实用指南。

garlic的博客 769

网络编程基础

网络编程 计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。 网络编程 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。 网络模型 计算机网络之间以何种规则进行通信,就是网络模型研究问题。 OSI(Open System Inte...

腾阿腾的博客 257

Vek385评估板(二):板子联网 & memtester安装(LPDDR5X测试)

继上一篇文章:Vek385评估板(一):EDF成功烧录启动及一些问题。 本章完成最主要的两个功能:开发板联网+内存 memtester。因为我是做测试行业的,所以这两个是最想试的。内存测试,除了FPGA测,也可以系统级测,本次在versal上实现这个功能,主要是可以应急。在没有安卓、X86的情况下,可以使用本方案测试。 下一篇会继续做一些其他功能。

千歌叹尽执夏的博客 221

133.在 Vue3 中使用 OpenLayers 实现画多边形、任意编辑、遮罩与剪切处理功能

《Vue3+OpenLayers实现多边形绘制与区域处理》摘要:本文介绍如何基于Vue3+OpenLayers+ol-ext实现地图多边形交互功能。核心功能包括:鼠标绘制任意多边形、拖动顶点编辑边界、遮罩显示(非选区变红)、选区剪切显示及功能重置。技术方案采用OpenLayers处理地图渲染,ol-ext实现高级遮罩/剪切效果,ElementPlus提供UI控件。该方案适用于城市规划、园区展示等需要区域标记的场景,完整代码展示了从初始化、绘制、编辑到特效处理的全流程实现。

小彭的博客 958

java udp 聊天室_Java基于UDP协议实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些Java方面的技术应用。今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序。现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆。先看一下效果:实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理。“聊天室001”的用户,小红和小绿相互聊了两句,“聊天室002”的小黑无人理会,在一旁寂寞着。看一下代码实现:1、首先是消息服...

weixin_35727440的博客 856

【异常】‘build.plugins.plugin.version‘ for org.apache.maven.plugins:maven-resources-plugin is missing

maven-compiler-plugin 插件版本信息没有指定导致了错误提示如下字面意思就是没有指定版本信息。

奶爸的编程之路,也就一周冷个三天 4599

Java网络编程——基于UDP协议的聊天室

UDP(User Datagram Protocol)协议是Internet 协议集支持的一个无连接的传输协议,中文名为用户数据报协议。它为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。    Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是TCP,该协议几乎做了所有的事情。“when in trouble , use TCP”。...

qq_52223733的博客 2957

十五、SAP-物料需求计划(MRP)

业务逻辑、功能讲解、图文解析、章节总结

m0_72403327的博客 1091

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些java方面的技术应用。今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序。现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆。先看一下效果:实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理。“聊天室001”的用户,小红和小绿相互聊了两句,“聊天室002”的小黑无人理会,在一旁寂寞着。看一下代码实现:1、首先是消息服...

weixin_29541743的博客 781

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

简单多人聊天室——java网络编程

简单多人聊天室——java网络编程 文章目录简单多人聊天室——java网络编程一、网络编程基础1、什么是网络?2、网络编程三要素二、使用ServerSocket类完成服务器的构建三、Socket类搭建客户端类四、运行结果 一、网络编程基础 1、什么是网络? 计算机网络是指将多台不同的计算机及其外部设备,通过通信线路连接起来,从而达到资源共享和通讯的目的。 按分布范围可分为:广域网WAN 城域网MAN 局域网WAN 个人局域网PAN 按使用者分:公用网:移动,电信等 专用网:军队,政府使用的网络 按交换

weixin_47376718的博客 1493

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java网络编程,使用Java实现UDP和TCP网络通信协议,以及基于UDP的在线聊天室。

Java网络编程,使用Java实现UDP和TCP网络通信协议,以及基于UDP的在线聊天室。

qq_43403676的博客 2954

Java网络编程(两种聊天室:TCP和UDP)

Java网络编程,含TCP聊天程序以及UDP聊天程序

yangsf_的博客 5017

Java网络编程入门指南:实现一个多人聊天室

Socket是Java网络编程的基本组成部分,它允许应用程序通过网络发送和接收数据。这个简单的聊天室示例允许多个客户端通过输入消息与服务器进行通信,服务器会将接收到的消息广播给所有连接的客户端。客户端和服务器之间的通信是基于Socket实现的。创建一个基本的Java服务器,以便接受来自客户端的连接请求和数据传输。创建一个基本的Java客户端,以便连接到服务器并进行数据传输。创建一个基本的RMI客户端,以便调用远程服务器上的方法。创建一个基本的RMI服务,以便远程调用服务器上的方法。

futurn_hero的博客 3080

java udp socket 聊天室_Java基于UDP协议实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些java方面的技术应用。今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序。现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆。先看一下效果:实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理。“聊天室001”的用户,小红和小绿相互聊了两句,“聊天室002”的小黑无人理会,在一旁寂寞着。看一下代码实现:1、首先是消息服...

weixin_33816175的博客 370
上一篇: 牛刀小试 - 详细总结Java-IO流的使用
下一篇: Java网络编程 - 浅析web服务器与浏览器的实现原理
LaterEqualsNever
博客等级 码龄12年 297粉丝 61原创
评论 36
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值