详解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

相关文章

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处