这边我会简单介绍一下聊天室的组成部分,和思路的引导
涉及知识点 java 中异常处理机制 和 io流和网络编程socket
简单回顾异常机制
Java中的异常机制是一种用于处理程序运行期间出现的错误或异常情况的机制。这种机制允许程序员定义在特定情况下可能发生的错误,并提供了一种方式来处理这些错误,从而防止程序崩溃。
简单回顾IO流
IO流,全称Input/Output Stream,代表数据的无结构化传递。在程序中,按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列来处理。流是一种抽象概念,用于描述数据在设备间的传输过程。IO流的主要作用是处理设备间的数据传输问题,常见的应用包括文件上传、下载、复制等。
简单回顾socket
Socket是用于网络通信的一个关键类。它提供了一种方式来创建网络连接,使得两台或多台计算机之间可以进行数据交换。通过Socket,我们可以建立客户端和服务器之间的连接,发送和接收数据。
这边是其知识点详细介绍
异常
异常的基本概念
- 异常类:Java中定义了许多异常类,如
IOException
、NullPointerException
等,它们都继承自Throwable
类。Throwable
类又分为Error
和Exception
两个主要分支。Error
通常表示严重的系统级错误,如JVM错误,而Exception
则用于表示程序运行过程中可能出现的问题。- 抛出异常:当程序遇到无法处理的错误情况时,它会抛出一个异常。这可以通过使用
throw
关键字和异常对象来实现。- 捕获异常:程序可以使用
try-catch
语句块来捕获和处理异常。当try
块中的代码抛出异常时,控制流会立即转移到相应的catch
块,在那里可以处理异常。异常处理流程
- try块:包含可能抛出异常的代码。
- catch块:用于捕获并处理特定类型的异常。可以有多个
catch
块来处理不同类型的异常。- finally块(可选):无论是否发生异常,
finally
块中的代码都会被执行。这通常用于释放资源或执行清理操作。- throw关键字:用于显式地抛出一个异常。
- throws关键字:在方法签名中使用,用于声明该方法可能抛出的异常。这样,调用该方法的代码就需要处理这些异常。
异常类型
- 检查型异常(Checked Exceptions):这些异常在编译时被检查。如果方法可能抛出检查型异常,那么该方法必须使用
throws
关键字声明这些异常,或者使用try-catch
块来处理它们。常见的检查型异常有IOException
、SQLException
等。- 非检查型异常(Unchecked Exceptions):这些异常是运行时异常,继承自
RuntimeException
。它们通常表示编程错误,如NullPointerException
、ArrayIndexOutOfBoundsException
等。非检查型异常不需要在方法签名中声明。异常链
Java还支持异常链,允许一个异常在抛出时携带另一个异常的信息。这通常用于包装底层异常,以便在更高级别的代码中提供更详细的错误信息。
自定义异常
除了Java内置的异常类外,程序员还可以定义自己的异常类。这通常用于表示特定于应用程序的错误情况。自定义异常类应该继承自
Exception
或其子类。总结
Java的异常机制提供了一种结构化的方式来处理程序中可能出现的错误情况。通过合理地使用异常处理机制,可以提高程序的健壮性和可维护性。
主要记住 异常是分两种
非检查异常(逻辑错误导致的异常通过运行判断) 可以不用写try-catch,通常根据业务自定义异常
检查异常 (人为不可控的异常在编译期被检查) 必须抛出异常,根据异常处理机制处理异常,这个用java自带异常足够了
IO流
根据不同的分类标准,IO流可以分为多种类型:
- 按照流的流向,IO流可以分为输入流和输出流。输入流只能从中读取数据,而不能向其写入数据,由InputStream和Reader作为基类;输出流只能向其写入数据,而不能从中读取数据,由OutputStream和Writer作为基类。
- 按照流所操作的数据单元,IO流可以分为字节流和字符流。字节流操作的数据单元是8位字节,由InputStream和OutputStream作为基类;字符流操作的数据单元是16位的字符,由Reader和Writer作为基类。
- 按照流的角色,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.comhttps://book.yunzhan365.com/bfctn/rxcn/mobile/index.html服务端
ServerScoket 是服务端插口 需要确保端口不被占用 ,用 ServerSocket 接受用户端的插口,因为服务端常用与一对多需要重复接受用户端的插口,封装一个处理客户端输出的线程类,避免一个接受用户的插口和接受用户输入的数据冲突,将用户第一次输入的数据作为昵称封装私有属性,其次封装从插口中获取的客户端的ip地址,读取用户的数据 ,根据读取的字符同null比较,来处理用户端输入的所有数据 , 将服务端的数据反馈给客户端,处理多个客户端数据实现群聊,创建一个集合,存储用户输入的数据,这边需要将用户输入的数据传递给集合在遍历集合输出给用户,为了方便定义了一个专门遍历集合的方法,我们统计了上线人数,以便后来我们考虑了线程并发问题,将添删集合元素上了一把同步锁,让后我们想要删除集合元素和增加集合元素独立不影响,我们把遍历集合上了一把互斥锁,最后我们实现了私聊的功能,封装了一个处理私聊的方法,根据正则表达式判断输入数据符合私聊的规则,根据在线中昵称判断用户是否存在
思路mind图
服务端您也想制作这样的电子书?快上云展网!网址:yunzhan365.comhttps://book.yunzhan365.com/bfctn/yfyp/mobile/index.html
这边暂时总结到这里, 这边我先上传一下代码和思维导图,有兴趣的朋友可以一起探讨,我这边也在学习java,我可以问一下我们的培训老师的哈
完整版代码
java -聊天室的代码: 用于存放聊天室的项目的代码和思路导图https://gitee.com/to-uphold-justice-for-others/java---code-for-chat-rooms.git