java-网络编程socket-聊天室-先导

这边我会简单介绍一下聊天室的组成部分,和思路的引导

涉及知识点 java 中异常处理机制 和 io流和网络编程socket

简单回顾异常机制

Java中的异常机制是一种用于处理程序运行期间出现的错误或异常情况的机制。这种机制允许程序员定义在特定情况下可能发生的错误,并提供了一种方式来处理这些错误,从而防止程序崩溃。

简单回顾IO流

IO流,全称Input/Output Stream,代表数据的无结构化传递。在程序中,按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列来处理。流是一种抽象概念,用于描述数据在设备间的传输过程。IO流的主要作用是处理设备间的数据传输问题,常见的应用包括文件上传、下载、复制等。 

简单回顾socket

Socket是用于网络通信的一个关键类。它提供了一种方式来创建网络连接,使得两台或多台计算机之间可以进行数据交换。通过Socket,我们可以建立客户端和服务器之间的连接,发送和接收数据。 

这边是其知识点详细介绍

异常

异常的基本概念

  1. 异常类:Java中定义了许多异常类,如IOExceptionNullPointerException等,它们都继承自Throwable类。Throwable类又分为ErrorException两个主要分支。Error通常表示严重的系统级错误,如JVM错误,而Exception则用于表示程序运行过程中可能出现的问题。
  2. 抛出异常:当程序遇到无法处理的错误情况时,它会抛出一个异常。这可以通过使用throw关键字和异常对象来实现。
  3. 捕获异常:程序可以使用try-catch语句块来捕获和处理异常。当try块中的代码抛出异常时,控制流会立即转移到相应的catch块,在那里可以处理异常。

异常处理流程

  1. try块:包含可能抛出异常的代码。
  2. catch块:用于捕获并处理特定类型的异常。可以有多个catch块来处理不同类型的异常。
  3. finally块(可选):无论是否发生异常,finally块中的代码都会被执行。这通常用于释放资源或执行清理操作。
  4. throw关键字:用于显式地抛出一个异常。
  5. throws关键字:在方法签名中使用,用于声明该方法可能抛出的异常。这样,调用该方法的代码就需要处理这些异常。

异常类型

  • 检查型异常(Checked Exceptions):这些异常在编译时被检查。如果方法可能抛出检查型异常,那么该方法必须使用throws关键字声明这些异常,或者使用try-catch块来处理它们。常见的检查型异常有IOExceptionSQLException等。
  • 非检查型异常(Unchecked Exceptions):这些异常是运行时异常,继承自RuntimeException。它们通常表示编程错误,如NullPointerExceptionArrayIndexOutOfBoundsException等。非检查型异常不需要在方法签名中声明。

异常链

Java还支持异常链,允许一个异常在抛出时携带另一个异常的信息。这通常用于包装底层异常,以便在更高级别的代码中提供更详细的错误信息。

自定义异常

除了Java内置的异常类外,程序员还可以定义自己的异常类。这通常用于表示特定于应用程序的错误情况。自定义异常类应该继承自Exception或其子类。

总结

Java的异常机制提供了一种结构化的方式来处理程序中可能出现的错误情况。通过合理地使用异常处理机制,可以提高程序的健壮性和可维护性。

主要记住 异常是分两种

非检查异常(逻辑错误导致的异常通过运行判断) 可以不用写try-catch,通常根据业务自定义异常

检查异常 (人为不可控的异常在编译期被检查) 必须抛出异常,根据异常处理机制处理异常,这个用java自带异常足够了

IO流

根据不同的分类标准,IO流可以分为多种类型:

  1. 按照流的流向,IO流可以分为输入流和输出流。输入流只能从中读取数据,而不能向其写入数据,由InputStream和Reader作为基类;输出流只能向其写入数据,而不能从中读取数据,由OutputStream和Writer作为基类。
  2. 按照流所操作的数据单元,IO流可以分为字节流和字符流。字节流操作的数据单元是8位字节,由InputStream和OutputStream作为基类;字符流操作的数据单元是16位的字符,由Reader和Writer作为基类。
  3. 按照流的角色,IO流可以分为节点流和处理流。节点流可以从向一个特定的IO设备(如磁盘、网络)读/写数据的流,也被称为低级流;处理流则是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写,也被称为高级流。

这边聊天室用的是字符流高级处理流,

字符读取流  BufferedReader 字符缓冲输入流

字符输出流  PrintWriter 字符缓冲打印输出流,其根据 换行符判断

Socket

基本概念

  • 客户端Socket:通常由想要连接服务器的应用程序创建。客户端Socket会指定要连接的服务器地址和端口,然后发送连接请求。一旦连接建立,客户端就可以通过Socket发送和接收数据。
  • 服务器Socket:由服务器应用程序创建,用于监听来自客户端的连接请求。服务器Socket绑定到一个特定的端口上,等待客户端的连接。一旦有客户端连接,服务器就可以接受这个连接,并与客户端进行通信。

主要方法

  • ServerSocket(int port):创建一个服务器Socket,并绑定到指定的端口。
  • Socket(String host, int port):创建一个客户端Socket,并连接到指定的主机和端口。
  • getInputStream() 和 getOutputStream():分别用于获取Socket的输入流和输出流,用于读取和写入数据。
  • close():关闭Socket连接。

使用场景

Socket在Java中通常用于实现基于TCP/IP协议的网络通信。例如,你可以使用Socket来创建一个简单的聊天程序,其中一个程序作为服务器,监听客户端的连接请求,另一个或多个程序作为客户端,连接到服务器并发送消息。

聊天室的思路

客户端

Socket 连接服务器的ip地址和端口 根据Scanner扫描用户输出的值, 根据socket接受其输出流 根据PrintWriter输出,

为了服务端判断其用户名,这边将第一次输出的值作为昵称,然后我们想要中断输出 使用 exit字符串作为判断条件,其次为了保证消息可靠传输 会关闭插口,为了每个客户端能接受服务端输给客户端的消息,这边封装一个类专门处理的服务端发过来的数据,在将其处理成守护线程,这个保证客户端不用处理服务端的输入流,同时保证一旦线程结束服务端不会在发送给客户端数据.

思路mind图 

客户端您也想制作这样的电子书?快上云展网!网址:yunzhan365.comicon-default.png?t=N7T8https://book.yunzhan365.com/bfctn/rxcn/mobile/index.html服务端

ServerScoket 是服务端插口 需要确保端口不被占用 ,用 ServerSocket 接受用户端的插口,因为服务端常用与一对多需要重复接受用户端的插口,封装一个处理客户端输出的线程类,避免一个接受用户的插口和接受用户输入的数据冲突,将用户第一次输入的数据作为昵称封装私有属性,其次封装从插口中获取的客户端的ip地址,读取用户的数据 ,根据读取的字符同null比较,来处理用户端输入的所有数据 , 将服务端的数据反馈给客户端,处理多个客户端数据实现群聊,创建一个集合,存储用户输入的数据,这边需要将用户输入的数据传递给集合在遍历集合输出给用户,为了方便定义了一个专门遍历集合的方法,我们统计了上线人数,以便后来我们考虑了线程并发问题,将添删集合元素上了一把同步锁,让后我们想要删除集合元素和增加集合元素独立不影响,我们把遍历集合上了一把互斥锁,最后我们实现了私聊的功能,封装了一个处理私聊的方法,根据正则表达式判断输入数据符合私聊的规则,根据在线中昵称判断用户是否存在

思路mind图

服务端您也想制作这样的电子书?快上云展网!网址:yunzhan365.comicon-default.png?t=N7T8https://book.yunzhan365.com/bfctn/yfyp/mobile/index.html

这边暂时总结到这里, 这边我先上传一下代码和思维导图,有兴趣的朋友可以一起探讨,我这边也在学习java,我可以问一下我们的培训老师的哈

完整版代码 

java -聊天室的代码: 用于存放聊天室的项目的代码和思路导图icon-default.png?t=N7T8https://gitee.com/to-uphold-justice-for-others/java---code-for-chat-rooms.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql慢sql排查与分析

当MySQL遇到慢查询(慢SQL)时,我们可以通过以下步骤进行排查和优化: 标题开启慢查询日志: 确保MySQL的慢查询日志已经开启。通过查看slow_query_log和slow_query_log_file变量来确认。 如果没有开启,可以…

闻风丧胆的算法(二)

🌈个人主页:Rookie Maker 🔥 系列专栏:算法 🏆🏆关注博主,随时获取更多关于IT的优质内容!🏆🏆 😀欢迎来到我的代码世界~ 😁 喜欢的小…

小林coding图解计算机网络|基础篇01|TCP/IP网络模型有哪几层?

小林coding网站通道:入口 本篇文章摘抄应付面试的重点内容,详细内容还请移步: 文章目录 应用层(Application Layer)传输层(Transport Layer)TCP段(TCP Segment) 网络层(Internet Layer)IP协议的寻址能力IP协议的路由能力 数据链路层(Link Lay…

一文介绍回归和分类的本质区别 !!

文章目录 前言 1、回归和分类的本质 (1)回归(Regression)的本质 (2)分类(Classification)的本质 2、回归和分类的原理 (1)回归(Regression&#x…

Vue3(学自尚硅谷)

一、基础准备工作 (一)过程 环境要求:有node.js环境、npm。执行命令: npm create vuelatest 而后选择: ✔ 请输入项目名称: … me_vue3 ✔ 是否使用 TypeScript 语法? … 否 / 是 ✔ 是否启用…

干货| 这篇电商数据分析案例一定要看!

主流电商商品数据采集API接口 直播带货行业在经历了高端玩家的“春秋争霸”之后,逐渐进入到了一种“网红化”的阶段。人们正在将注意力从原来凤毛麟角的直播巨头逐渐转移到一些小主播身上。但近短时间却出现了网红带货营销额放缓的现象。因此商家必须要调整直播策略…

【数据库】数据库的介绍、分类、作用和特点,AI人工智能数据如何存储

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《数据库》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识…

互联网轻量级框架整合之JavaEE基础II

编写本篇代码并实际执行之前请仔细阅读前一篇互联网轻量级框架整合之JavaEE基础I Servlet 在Servlet容器中,Servlet是最基础的组件,也可以把JSP当做Servlet,JSP的存在意义只在于方便编写动态页面,使Java语言能和HTML相互结合&…

产品推荐 | 中科亿海微推出亿迅®A8000金融FPGA加速卡

01、产品概述 亿迅A8000金融加速卡,是中科亿海微联合金融证券领域的战略合作伙伴北京睿智融科,将可编程逻辑芯片与金融行业深度结合,通过可编程逻辑芯片对交易行情加速解码,实现低至纳秒级的解码引擎,端到端的处理时延…

Linux gcc day3

find命令(importance): 语法:find pathname -options find /root -name test.c which命令: which [指令] 只搜索指令,在什么位置下 为什么文件夹带有颜色呢? 科普补充alias命令: ali…

C++:赋值运算符(17)

赋值也就是将后面的值赋值给变量,这里最常用的就是 ,a1那么a就是1,此外还包含以下的赋值运算 等于int a 1; a10 a10加等于int a 1; a1;a2-减等于int a 1; a-1;a0*乘等于int a 2; a*5;a10/除等于int a 10; a/2;a5%模等于int a 10; a%…

kafka集群介绍+部署Filebeat+Kafka+ELK

一、消息队列 1、为什么需要消息队列(MQ) 主要原因是由于在高并发环境下,同步请求来不及处理,请求往往会发生阻塞。比如大量的请求并发访问数据库,导致行锁表锁,最后请求线程会堆积过多,从而触…

Mac电脑清理垃圾软件 Mac电脑清理垃圾的文件在哪 cleanMyMac X 4.8.0激活号码

Mac用户经常会有这样一些烦恼,比如软件之间的管理,应用生成的缓冲文件怎样删除,还有软件的卸载等等... 如何有效清理Mac中的垃圾文件,删除多余的软件成为Mac用户迫切的需求。本文就为大家介绍几款好用的Mac电脑清理垃圾软件&#…

在线考试|基于Springboot的在线考试管理系统设计与实现(源码+数据库+文档)

在线考试管理系统目录 目录 基于Springboot的在线考试管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台: 2、后台 管理员功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主…

Redis中的Sentinel(二)

Sentinel 初始化Sentinel状态。 在应用了Sentinel的专用代码之后,接下来,服务器会初始化一个sentinel.c/sentinelState结构(简称Sentinel状态),这个结构 保存了服务器中所有和Sentinel功能有关的状态(服务器的一般状态仍然由redis.h/redisServer保存);…

SaaS 电商设计 (十) 记一次 5000kw 商品数据ES迁移 (详细的集群搭建以及线上灰度过程设计)

目录 一.背景二.技术目标三.技术方案3.1 整体流程3.2 ES 切换前:完成整体新集群的搭建.i:拓扑结构设计ii: 如何选择整体的 **ES** 集群配置. 3.3 **ES** 版本切换中3.3.1 多client版本兼容3.3.2 Router的设计 3.4 ES 切换后3.5 开箱即用3.5.1 开箱使用 demo 演示3.5.2 使用过程…

团体程序设计天梯赛-练习集 01

天梯赛题解合集 团体程序设计天梯赛-练习集 (L1-001 - L1-012) 团体程序设计天梯赛-练习集 (L1-013 - L1-024) 团体程序设计天梯赛-练习集 (L1-025 - L1-036) 团体程序设计天梯赛-练习集 (L1-037 - L1-048) L1-001 Hello World 输出题 样例 输入 输出 Hello World!思…

图像处理ASIC设计方法 笔记13 图像旋转ASIC的输入输出电路

文章目录 1 DPRAM:双端口 RAM2 IDT Integrated Device Technology, Inc. 公司介绍3 IDT70T633S10DDI4 TMS320C64145 旋转ASIC的输入输出框图图像旋转ASIC的输入输出电路案例用到的芯片相关介绍如下。 1 DPRAM:双端口 RAM DPRAM 的特点是可以通过两个端口同时访问,具有两套完全…

数据结构入门系列-栈的结构及栈的实现

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 栈 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一段进行插入和删除元素操作,进行数据输入和删除操作的一端称为栈顶,另…

InternLM2-Chat-1.8B 模型测试

在interStudio进行InternLM2-Chat-1.8B模型访问,进入开发机后 配置基础环境 新建conda环境并且进入 conda create -n demo python3.10 -y conda activate demo 下载pytorch等相关包 conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.…