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

news2024/11/19 4:17:55

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

涉及知识点 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.coloradmin.cn/o/1570767.html

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

相关文章

Revit 2025新功能一览~

Hello大家好!我是九哥~ Revit2025已经更新,安装后,简单试了下,还是挺不错的,流畅度啊,新功能啊,看来还是有听取用户意见的,接下来就简单看看都有哪些新功能。 好了,今天的…

小红书自动化仿写发文机器人了解一下

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

CCIE-08-BGP-Listen

目录 实验条件网络拓朴实验目的 开始配置配置动态路由协议配置BGP检查邻居配置 实验条件 网络拓朴 实验目的 将R1配置成Listen状态,自动接收来自其它路由器的建邻居请求、建立邻居 开始配置 配置动态路由协议 这里用EIGRP来配置,保证网络的可达性&a…

2024年华为OD机试真题-推荐多样性-Java-OD统一考试(C卷)

题目描述: 推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略: 1. 各个列表元素需要做穿插处理,即先从…

ES11 学习

文章目录 1. Promise.allSettled2. Module 新增2.1 ! 动态导入 import()2.2 import.meta2.3 export * as obj from module 3. 字符串 matchAll()4. BigInt实际开发相关使用 5. globalThis6. 空值合并运算符7. 可选链操作符 1. Promise.allSettled Promise.allSettled() 返回一个…

应急响应实战笔记05Linux实战篇(2)

第2篇:捕捉短连接 0x00 前言 ​ 短连接(short connnection)是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时,才去建立一个连接,数据发送完成后,则断开此连接…

Azure service tag 导致的Exchange online 无法发送邮件的问题

最近碰到一个比较有趣的客户问题。 这个客户一直在使用Exchange online 与自己在Azure Vnet 里面的exchange server交换邮件。 客户的网络架构如下图所示。 客户说之前从exchange online往外发邮件一直是好的,但是最近两周开始只有百分之3左右的邮件可以发出去,其他的都pen…

C语言中的结构体:高级特性与扩展应用

前言 结构体在C语言中的应用不仅限于基本的定义和使用,还包含一些高级特性和扩展应用,这些特性和应用使得结构体在编程中发挥着更加重要的作用。 一、位字段(Bit-fields) 在结构体中,我们可以使用位字段来定义成员…

【性能测试】接口测试各知识第2篇:学习目标,1. 理解接口的概念【附代码文档】

接口测试完整教程(附代码资料)主要内容讲述:接口测试,学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标,RESTFUL1. 理解接口的概念,2.什么是接口测试…

mybatis流式游标查询-导出DB大数据量查询OOM问题

问题场景 Mysql数据处理类型分以下三种 com.mysql.cj.protocol.a.result.ResultsetRowsStatic:普通查询,将结果集一次性全部拉取到内存 com.mysql.cj.protocol.a.result.ResultsetRowsCursor:游标查询,将结果集分批拉取到内存&…

Windows集群部署项目

目录 一,环境准备 1.1.安装MySQL 1.2.安装JDK 1.3.安装TomCat 1.4.安装Nginx 二,部署 2.1.后台服务部署 2.2.Nginx配置负载均衡及静态资源部署 一,环境准备 1.1.安装MySQL 可以参考博客:http://t.csdnimg.cn/A75bg 1.2.…

我为什么会选择Vim来开发Go项目及Vim IDE安装配置和操作

你好,我是孔令飞,字节跳动云原生资深研发、前腾讯云原生技术专家。《企业级 Go 项目开发实战》、《从零开发企业级 Go 应用》作者,欢迎加入 孔令飞的云原生实战营,助你进阶 Go 云原生高级开发工程师。 作为一名 Golang 开发&…

训练营十六天(二叉树part03)

104.二叉树的最大深度 力扣题目链接(opens new window) 题目 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7]&…

从头开发一个RISC-V的操作系统(四)嵌入式开发介绍

文章目录 前提嵌入式开发交叉编译GDB调试,QEMU,MAKEFILE练习 目标:通过这一个系列课程的学习,开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提 这个系列的大部分文章和知识来自于:[完结] 循序渐进&#x…

leetcode 热题 100(部分)C/C++

leetcode 热题 100 双指针 盛最多水的容器 【mid】【双指针】 思路: 好久没写代码sb了,加上之前写的双指针并不多,以及有点思维定势了。我对双指针比较刻板的印象一直是两层for循环i,j,初始时i,j都位于左界附近&…

MySQL数据库 数据库基本操作(三):表的增删查改(中)

1. 数据库的约束 1.1 约束类型(一般发生于表的创建中) NOT NULL - 指示某列不能存储 NULL 值。UNIQUE - 保证某列的每行必须有唯一的值。DEFAULT - 规定没有给列赋值时的默认值。PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合&#xf…

【CSS】浮动笔记及案例

CSS浮动 1. 认识浮动 float属性可以指定一个元素沿着左侧或者是右侧放置,允许文本和内联元素环绕它 float属性最初只使用文字环绕图片但却是早起CSS最好用的左右布局方案 绝对定位、浮动都会让元素脱标,以达到灵活布局的目的可以通过float属性让元素脱…

FTP,NFS,SSH服务安装和应用,遇到的问题

文章目录 一、FTP是什么?二、NFS是什么?三、SSH是什么?四、FTP,NFS,SSH安装(Ubuntu 操作系统)1.FTP安装2.NFS安装3.SSH服务安装 五、FTP,NFS,SSH应用1.FTP应用12.FTP应用23.NFS应用4.SSH应用 六…

【快速解决】python缺少了PyQt5模块的QtMultimedia子模块

目录 问题描述 问题原因 解决方法 成功示范 问题描述 Traceback (most recent call last): File "d:\桌面\python项目\DesktopWords-master\main.py", line 4, in <module> from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent ModuleNotFoundEr…

动态规划刷题(算法竞赛、蓝桥杯)--线段(线性DP)

1、题目链接&#xff1a;P3842 [TJOI2007] 线段 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include <bits/stdc.h> using namespace std; const int N20010; int a[N][2],f[N][2]; //a[i][0]表示l[i],a[i][1]表示r[i] int dis(int a,int b){return abs(a-b); } int…