5.12学习总结

一.JAVA聊天室项目

文件发送

使用 Java Socket 实现聊天内容或文件的传输的原理如下:

  • 服务器端启动:聊天室的服务器端在指定的端口上监听客户端的连接。它创建一个 ServerSocket 对象,并通过调用 accept() 方法等待客户端的连接请求。
  • 客户端连接:聊天室的客户端通过创建一个 Socket 对象并指定服务器的地址和端口,与服务器建立连接。客户端和服务器之间的连接建立后,可以进行数据传输。
  • 服务器端接收消息:当客户端连接到服务器后,服务器会为每个客户端创建一个独立的线程,用于处理与该客户端的通信。在服务器端的线程中,通过调用输入流的 readLine() 方法读取客户端发送的消息。服务器可以根据接收到的消息类型(例如普通消息或文件传输请求),采取相应的处理逻辑。
  • 服务器端广播消息:服务器在接收到客户端发送的消息后,可以将该消息广播给其他连接到服务器的客户端。通过遍历保存所有客户端的列表,并调用相应客户端的输出流发送消息给客户端。
  • 客户端发送消息:客户端可以通过输出流向服务器发送消息。客户端将消息写入输出流,然后通过网络发送给服务器。
  • 客户端接收消息:客户端在一个独立的线程中通过输入流不断监听服务器端的消息。通过调用输入流的 readLine() 方法读取服务器端发送的消息,并进行相应的处理,如将消息显示在用户界面上。
  • 文件传输:客户端可以通过输入流读取文件内容,并通过输出流将文件数据发送给服务器。服务器在接收到文件数据后,可以将文件广播给其他客户端。

以上就是使用 Java Socket 实现简易多人聊天室传输聊天内容或文件的基本原理。通过建立客户端和服务器之间的连接,以及使用输入流和输出流进行数据的读写,可以实现实时的聊天和文件传输功能。

实现代码:

1.首先用文件选择器选择文件,将文件分片传送到服务端

private static void sendFile(File file, String filename, File selectedFile) throws IOException {int length = 1024 * 1024 * 5;byte[] bytes = new byte[length];int number = (int) Math.ceil((double) selectedFile.length() / length);FileInputStream fileInputStream = new FileInputStream(selectedFile.getPath());message tomessage = new message(messagetype, user, markTool.filemessage, filename, null, chatgroup, otheruser);connection.oos.writeObject(tomessage);for (int i = 0; i < number; i++) {byte[] buffer = new byte[length];int bytesRead = fileInputStream.read(buffer);message filemessage = new message(buffer, true);connection.oos.writeObject(filemessage);}byte[] buffer = new byte[length];int bytesRead = fileInputStream.read(buffer);message filemessage = new message(buffer, false);connection.oos.writeObject(filemessage);System.out.println("文件发送完成,共发送了 " + number + " 个文件块。");}

2.服务端接收到文件,并将文件下载到服务端,将下载的地址保存到数据库中

else if (mge1.messagetip.equals(markTool.filemessage)) {Thread threadB = new Thread(new Runnable() {@Overridepublic void run() {try {String path = "E:\\server\\src\\file" + "\\" + mge1.Textmessage;File file = new File(path);FileOutputStream fos = new FileOutputStream(file);while (true) {message getmessage = (message) ois.readObject();if (!getmessage.flag) {fos.write(getmessage.Filebytes);fos.flush();break;}fos.write(getmessage.Filebytes);fos.flush();}fos.close();// 更新聊天记录message getmessage = new message();new add(mge1, getmessage).addchattingrecords("filemessage", path, formattedDateTime);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}});threadB.start();try {threadB.join();} catch (InterruptedException e) {throw new RuntimeException(e);}}

3.下载文件同理,从服务器中数据库找到下载的路径,找到文件,再传递给客户端,客户端在通过用户选择文件路径下载.

二.聊天室项目构思

发起群聊:

从好友表选取人发送到服务器,服务器随机生成不重复的群号,存储在数据库,同时建立中间表,处理用户与群聊的关系

申请入群:

输入群号,发消息给服务器,服务器查询是否存在该群,若存在,查找群主和管理员,若群主,管理员等人在线,实时发送接收,若不在线下次登录成功提醒

发送消息:

若发送的人在线且在你的这个界面,实时接收更新,若在线不在你的这个界面,发出提醒,若不在线,下次登录提醒

退出群聊:发送消息,服务器删除相应数据

删除好友:

给服务器发送信息,服务器删除相应的数据,若被删的好友在线,实时更新

设置群消息

根据用户是否是群主和管理员是否能执行,修改保存后,发送给服务器,服务器更新相应数据

解散群聊

只有群主能够执行,发送请求给服务器,服务器删除群聊数据

群管理:

修改群头像,设置管理员

 

 

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

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

相关文章

HIVE卡口流量需求分析

HIVE卡口流量需求分析 目录 HIVE卡口流量需求分析 1.创建表格 插入数据 2.需求 3.总结&#xff1a; 1.创建表格 插入数据 CREATE TABLE learn3.veh_pass( id STRING COMMENT "卡口编号", pass_time STRING COMMENT "进过时间", pass_num int COMMENT …

【408精华知识】速看!各种排序的大总结!

文章目录 一、插入排序&#xff08;一&#xff09;直接插入排序&#xff08;二&#xff09;折半插入排序&#xff08;三&#xff09;希尔排序 二、交换排序&#xff08;一&#xff09;冒泡排序&#xff08;二&#xff09;快速排序 三、选择排序&#xff08;一&#xff09;简单选…

【云计算小知识】云管理的作用是什么?

云计算已经成为推动企业数字化转型&#xff0c;提升运营效率的重要力量。而在这个过程中&#xff0c;云管理作为确保云计算环境稳定、高效运行的关键环节&#xff0c;其作用愈发凸显。今天我们小编就给大家详细介绍一下云管理的作用是什么&#xff1f; 云管理的作用是什么&…

基于SpringBoot设计模式之创建型设计模式·抽象工厂模式

文章目录 介绍开始架构图&#xff08;以穿搭举例&#xff09;样例一&#xff08;html关于列表和表格的应用&#xff09;定义抽象工厂&#xff08;html&#xff09;定义抽象工厂需要制作抽象产物&#xff08;托盘&#xff09;定义具体工厂&#xff08;列表、表格&#xff09;定义…

经典文献阅读之--LiDAR-based 4D Occupancy Completion and Forecasting(基于激光雷达的4D占用补全与预测)

0. 简介 本文介绍了基于激光雷达的4D占用补全与预测。场景补全与预测是自动驾驶汽车等移动智能体研究中的两个常见的感知问题。现有的方法独立地处理这两个问题&#xff0c;导致这两方面的感知是分开的。在《LiDAR-based 4D Occupancy Completion and Forecasting》中&#xf…

Llama3中文聊天项目全能资源库

Llama3 中文聊天项目综合资源库&#xff0c;集合了与Lama3 模型相关的各种中文资料&#xff0c;包括微调版本、有趣的权重、训练、推理、评测和部署的教程视频与文档。1. 多版本支持与创新&#xff1a;该仓库提供了多个版本的Lama3 模型&#xff0c;包括基于不同技术和偏好的微…

01 | 为什么需要消息队列?

哪些问题适合使用消息队列来解决&#xff1f; 1. 异步处理 2. 流量控制 使用消息队列隔离网关和后端服务&#xff0c;以达到流量控制和保护后端服务的目的。 3. 服务解耦 无论增加、减少下游系统或是下游系统需求如何变化&#xff0c;订单服务都无需做任何更改&#xff0c…

免费的GPT4终于要来了!OpenAI直播发布会详细解读!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

sql注入中的替换技巧。

目录 1&#xff1a;注释的替换 2&#xff1a;空格替换 3&#xff1a;大小写混合绕过及双写绕过 4&#xff1a;等号的绕过 5&#xff1a;单双引号的绕过 1&#xff1a;注释的替换 注释在sql注入中非常重要&#xff0c;因为会使用它来闭合我们注入的sql语句。 当以get方式提…

通过钉钉卡片进行工单审批

我们通常通过钉钉机器人来发送通知&#xff0c;提醒审批人名下有待办工单需要处理。这种通知方式仅能提醒审批人到ITSM中处理&#xff0c;审批人需要打开电脑登陆平台处理&#xff0c;我们就考虑是否能有一种方式能够满足移动端审批&#xff1f; 这里我们可以使用ITSM的移动端版…

使用Pyramid、Mako和PyJade生成 HTML

Pyramid 是一个流行的 Python Web 框架&#xff0c;而 Mako 和 PyJade 是用于模板引擎的工具&#xff0c;它们可以与 Pyramid 配合使用来生成 HTML 内容。但是在实际使用中还是有些差别的&#xff0c;尤其会遇到各种各样的问题&#xff0c;下面我将利用我所学的知识一一为大家解…

Django模型进阶

接上一节 4.查询数据 在Django中&#xff0c;正向查询&#xff08;Forward Query&#xff09;和反向查询&#xff08;Reverse Query&#xff09;是ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;中用于处理数据库表间关系时的两种查询方式&a…