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…

前端全方位进阶课程已经备好,陪你挑战年薪20w以上!

到目前为止我在视频号上已经顺利完成8场直播了。在此,我也很真诚的感谢小伙伴们对我的支持与厚爱!让我真真感受到了大家对技术的热忱! 这几场直播下来给我最直接的感受就是:累,很累!准确的说不应该是直播累…

Vue3(学自尚硅谷)

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

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

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

探索ChatGPT的学术应用:写出优质论文的突破之道

ChatGPT无限次数:点击直达 探索ChatGPT的学术应用:写出优质论文的突破之道 在当今信息爆炸的时代,人们对于文本生成和语言处理的需求越来越迫切。ChatGPT作为一种强大的自然语言处理模型,已经引起了广泛关注,并在实践中展现了其强…

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

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

从 Vue.js 到微信小程序 - 框架语法差异与开发技巧

作为一名有 Vue 开发经验的开发者,如果想快速掌握小程序开发,需要了解 Vue 和小程序在设计上的主要差异,这样可以更好地过渡和适应小程序的开发模式。以下是我总结的几个重点: 页面定义: Vue 中使用 .vue 文件定义页面,包含模板、脚本和样式。小程序中使用三个文件定义页面:WXM…

磁力链接的示例与解释

磁力链接(Magnet URI scheme)是一种特殊类型的统一资源标识符(URI),它包含了通过特定散列函数(如SHA-1)得到的文件内容的散列值,而不是基于位置或名称的引用。这使得磁力链接成为在分…

C++ templates: (4)、引用折叠

引用折叠(Reference collapsing)是C11中引入的一种规则,用于处理函数模板参数的类型和值完全匹配的情况。当一个非const左值引用和一个右值引用绑定到同一块内存时,引用折叠会发生。 引用折叠的规则如下: 如果两个引…

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

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

数字转型新动力,开源创新赋能数字经济高质量发展

应开放原子开源基金会的邀请,软通动力董事、鸿湖万联董事长黄颖基于对软通动力开源战略的思考,为本次专题撰文——数字转型新动力,开源创新赋能数字经济高质量发展。本文首发于2023年12月12日《中国电子报》“开源发展与开发者”专题第8版。以…

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

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

谷歌(Google)技术面试——在线评估问题(四)

谷歌(Google)面试过程的第一步,你可能会收到一个在线评估链接。 评估有效期为 7 天,包含两个编码问题,需要在一小时内完成。 以下是一些供你练习的在线评估问题。 在本章结尾处,还提供了有关 Google 面试不…

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) 主要原因是由于在高并发环境下,同步请求来不及处理,请求往往会发生阻塞。比如大量的请求并发访问数据库,导致行锁表锁,最后请求线程会堆积过多,从而触…

题目:求一个3*3矩阵对角线元素之和

题目:求一个3*3矩阵对角线元素之和 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated shoul…