5.12学习总结

news2024/9/25 23:24:28

一.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() {
                            @Override
                            public 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.coloradmin.cn/o/1677373.html

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

相关文章

GPT5 如何使用?GPT5 如何订阅?GPT5 功能全面详解

结论是&#xff1a;GPT2 很糟糕 &#xff0c;GPT3 很糟糕 &#xff0c;GPT4 可以 &#xff0c;但 GPT5 会很好。 ChatGPT5今年发布 GPT5发布的具有推理功能的不断发展&#xff0c;就像 iPhone 一样。 Sam Altman 于 17 日&#xff08;当地时间&#xff09;&#xff0c;在世界…

【数据结构】数据结构大汇总 {数据结构的分类总结:定义和特性、实现方式、操作与复杂度、适用场景、相关算法、应用实例}

一、线性结构 1.1 顺序表 定义和特性&#xff1a;顺序表是一种线性表的存储结构&#xff0c;它采用一段地址连续的存储单元依次存储线性表中的元素。顺序表具有随机访问的特性&#xff0c;即可以通过元素的下标直接访问元素。 实现方式&#xff1a;顺序表可以通过数组来实现&…

初识C++ · string的使用(2)

目录 1 Modifiers部分 1.1 assign的使用 1.2 insert的使用 1.3 erase的使用 1.4 replace的使用 2 capacity部分 2.1 max_size的使用 2.2 capacity的使用 2.3 reserve的使用 2.4 shrink_to_fit简介 2.5 resize的使用 2.6 clear的使用 3 String operations部分 3.1 …

Python查询和操作HTML文档库之pyquery使用详解

概要 在Web开发和数据抓取中,处理HTML文档是一项常见任务。Python的pyquery库提供了一个强大且灵活的方式来查询和操作HTML文档,类似于jQuery的语法。通过这篇文章,将深入了解pyquery的安装、特性、基本和高级功能,以及它在实际应用中的用例。 安装 安装pyquery相当简单,…

3、用Vue快雕塑搭建一个管理系统的页面布局框架

3.2.顶部栏header 在el-header标签里对标签栏header进行样式定义 <template><div id"app"><el-container><el-header style"background-color: #4c535a"><img src"/assets/logo.png" alt"" style"w…

做一个犬榜小程序,警示社会。

2024-5-15新闻&#xff1a;流浪狗咬死3岁男童。 相关链接&#xff1a;3岁男童被恶犬咬伤离世 母亲发声 急寻狗主讨公道_中华网 恶狗的主人终于付出代价 链接&#xff1a;这回&#xff0c;恶狗的主人终于付出代价 - 知乎 7岁女童家门口玩耍被恶犬咬伤头面部&#xff0c;多处撕…

深⼊理解指针(5)

目录 1. 回调函数是什么&#xff1f;1.1 使用回调函数修改 2. qsort使⽤举例2.1 使⽤qsort函数排序整型数2.2 使⽤qsort排序结构数据按年龄排序2.3 使⽤qsort排序结构数据按名字排序2.4整体代码 3. qsort函数的模拟实现3.1 整型数组的实现3.2 结构体按名字排序实现3.3 结构体按…

企业开发(日期格式处理)——注解 @JsonFormatvs VS 消息转换器?

在企业级应用程序开发中&#xff0c;日期是一个常见但又容易被忽视的问题。正确处理日期格式对于系统的正确性和用户体验至关重要。在本文中&#xff0c;我们将探讨两种常见的方式来处理日期格式&#xff1a;通过注解和通过扩展Spring MVC的消息转换器&#xff0c;以及它们各自…

Python-VBA函数之旅-zip函数

目录 一、zip函数的常见应用场景 二、zip函数使用注意事项 三、如何用好zip函数&#xff1f; 1、zip函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://myelsa1024.blog.csdn.net/ 一、zip函数的常见…

网络3--网络通信的深度理解(端口号)

网络通信的进一步理解 两个主机间进行通信&#xff0c;其实是两个主机间的软件进行通信&#xff0c;软件也就是可执行程序&#xff0c;运行时就是进程&#xff0c;所以也为进程间通信。 进程间通信需要共享资源&#xff0c;这里两个主机间的共享资源是网络&#xff0c;利用的是…

MVP产品设计与数据指标

MVP&#xff08;minimum viable product&#xff0c;最小化可行产品&#xff09;概念最早由埃里克莱斯提出&#xff0c;刊载于哈弗商业评论&#xff0c;并有出版物《精益创业》 和常规产品不同&#xff0c;MVP更侧重于对未知市场的勘测&#xff0c;用最小的代价接触客户的方法…

修改远程服务器Nginx默认端口

目录 前言 正文 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f4eb; You can reach me by url below:My Blo…

Scala编程基础1:基本数据类型、变量、if、for、IO

注意&#xff1a;Scala系列的文章需要一定的java基础 Scala底层是用java语言编写的&#xff0c;scala是运行在Java虚拟机&#xff08;JVM&#xff09;上的编程语言&#xff0c;它兼容Java&#xff0c;可以直接调用Java的库和框架&#xff0c;并与Java代码无缝集成和互操作。 …

【C语言习题】6.逆序输出

文章目录 1.描述输入描述&#xff1a;输出描述&#xff1a;示例图&#xff1a; 2.解题思路3.具体代码4.代码讲解 1.描述 输入10个整数&#xff0c;要求按输入时的逆序把这10个数打印出来。逆序输出&#xff0c;就是按照输入相反的顺序打印这10个数。 输入描述&#xff1a; 一…

Docker部署MaxKB详细步骤(window系统)

上面章节已经实现了ollama李现部署llama3&#xff0c;并实现了一些简单的问答&#xff0c;但是问答的界面是在命令提示符中&#xff0c;交互很不友好&#xff0c;也不方便局域网其他用户访问&#xff0c;所以这节用docker部署MaxKB实现网页访问llama3&#xff0c;首先电脑上需要…

【面试必看】MySQL部分

MySQL 1. 基础 1. 什么是关系型数据库&#xff1f; 一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系&#xff08;一对一、一对多、多对多&#xff09;。各种表中&#xff08;比如用户表&#xff09;&#xff0c;表中的每一行就存放着一条…

基于jsp+servlet的网上商城

网上商城系统&#xff08;jspservlethtmlcssjsbootstrap&#xff09; 一、运行项目 在项目的doc文件夹下&#xff0c;有文档&#xff0c;教您怎么启动项目。 二、运行截图 a.项目前端页面 b.后台登录界面 c.后台展示界面 三、用户名和密码 前台的用户名是&#xff1a;mor…

webpack并行构建示例:

由于js的单线程特性&#xff0c;文件和任务时 要等待一个任务执行完成后执行下一个任务&#xff0c;但在实际开发中&#xff0c;很多任务是可以并行执行的&#xff08;如同时处理多个不同js文件或同事压缩多张图片&#xff09;&#xff0c;一些loader和插件&#xff08;thread-…

apk反编译修改教程系列-----利用反编译辅助软件 轻松去除apk强制更新弹窗_2 [十八】

上期解析了去除软件强制更新的几种方式。在反编译apk操作中不管那种操作都要根据编译的软件性质来决定,没有那种方法通用于所有的软件 。例如去除更新弹窗。有的只需要修改版本号就可以了。有的需要好几种方法结合来操作去除。前面也讲了几款推荐的辅助编译工具,今天以其中的…

Selenium 自动化 —— 四种等待(wait)机制

更多关于Selenium的知识请访问CSND论坛“兰亭序咖啡”的专栏&#xff1a;专栏《Selenium 从入门到精通》 ​ 目录 目录 需要等待的场景 自己实现等待逻辑 Selenium 提供的三种等待机制 隐式等待&#xff08;Implicit Waits&#xff09; 隐式等待的优点 隐式等待的缺点 …