详解Java实现网络通信(TCP、UDP通信)——实现群聊功能

2023-12-27 09:20

本文主要是介绍详解Java实现网络通信(TCP、UDP通信)——实现群聊功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引文

image-20231208162202224

image-20231208162309407

image-20231208162330178

image-20231208162410346

image-20231208162442779

网络通信三要素

image-20231208162518965

1.IP地址

描述

image-20231208162633520

image-20231208162704856

image-20231208162940923

image-20231208163110575

InetAddress类

静态方法直接类名.调用

image-20231208163256785

示例代码:

image-20231208163344540

image-20231208163531822

image-20231208163719186

2.端口

image-20231208164029023

3.协议

image-20231208164112777

image-20231208164316466

TCP和UDP通信

UPD协议

image-20231208165627091


TCP协议

image-20231208165035826

三次握手建立连接

image-20231208165132391

TCP协议通过三次握手确认客户端和服务端收发消息都没问题。

四次握手断开连接

image-20231208165522947


1.UDP通信

image-20231208170013749

image-20231208170128938

示例代码

1.客户端发数据

image-20231208170506347

注意最后用完的话,记得socket.close()释放资源

2.服务端接收数据(要接收多个客户端的数据,多开客户端就行)

image-20231208170926379

服务器一般要长期运行,可以socket.close()根据具体情况来写

3.服务端不但可以接收数据,还可以接收客户端ip地址和端口号

image-20231208171143391

2.TCP通信

1.客户端开发

image-20231208171936440

image-20231208172210117

2.服务端开发

image-20231208172434669

image-20231208172705427

dis.readUTF()后记得dis.flush();

总结

image-20231208172833240

3.多发多收

image-20231208173106310

服务端没必要dis.close()和socket.close()

image-20231208173229375

若服务端断开连接,服务端抛异常

image-20231208173443703

所以服务端可以捕获异常

image-20231208173604027

上面代码的缺点是服务端是只能接收第一个客户端的请求(一直卡在dis.readUTF哪里接收第一个客户端的消息),只能与一个客户端进行通信,要与多个客户端进行通信需要用多线程知识

4.多个客户端同时通信(重点)

image-20231208174422733

改善服务端代码

image-20231208174843573

image-20231208174916406

5.综合案例(群聊——C/S架构)

image-20231208175102539

1.

image-20231208180654227

  1. image-20231208180314230

image-20231208180632192

发消息给所有人

image-20231208180747888

3.创建客户端线程接收群聊中所有人发的消息

image-20231208180918013

4.客户端为每个其他客户端创建一个线程接收该客户端的消息

image-20231208181001101

3.实现一个简单的B/S架构(案例)

image-20231208181347040

B/S架构无需开发客户端(浏览器),只需服务端

image-20231208181951993

image-20231208182012279

客户端开发

image-20231208182345693

4.用线程池优化BS架构

用线程池的好处,当任务队列不多时,可以一直用指定数量的线程处理任务,不用每次来个任务就创建一个线程来进行处理,还有就是防止创建很多线程以至于宕机。

image-20231208183132824

这篇关于详解Java实现网络通信(TCP、UDP通信)——实现群聊功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/542656

相关文章

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom