java socket聊天室 swing做界面 Tcp为通讯协议 支持私聊 群聊 发文件

2023-11-11

                        Java的的的的聊天室


           源代码下载

            首先我们来看看程序界面,丑到爆!!!,勉强能用就行啦微笑

           第一个:登录界面

                    


              第二个:用户界面

                        


                   第三个:服务器界面

            

               


          好了上面三个界面是程序的主界面,下面我们先讲讲如何使用源代码

             使用条件:一数据库,我这里用的MySQL的的的数据库,如果使用其他数据库比如甲骨文

                                      需要去cn.scau.util包的DBproperties配置文件中重新配置数据库参数

                                                    我们来看看原来的配置

                              比如username password url使用jdbc的朋友应该更懂,还有自己导入对应数据库的驱动包


                                 二。数据库中所用到的表

                                                                  首先看看表结构

                                                                  说明一下各个字段的类型:

                                                               字段类型

                                                        register_time:TIMESTAMP

                                                                                   用户名:VARCHAR

                                                          密码:VARCHAR

                                                          昵称:VARCHAR

                                                           USER_ID:INT

                                           所以要建立chatuser表先,再在配置文件DBproperties中配置数据库


                      三:我是用的netbeans的编写的,如果用的NetBeans的导入项目的话,再满足上面两个条件就可以运行啦


   好了讲完使用,我们来说说程序的整体思路

      首先看看客户端和服务端的流程图



    什么意思呢?我来解释一下

   首先,图中有三个类,一个方法。三个类分别是:ServerThread,ClientThreadMessageThread

                  一个方法: conServer

   其中:ServerThread,ClientThread属于服务器的类,而MessageThread,conServer属于客户端

 

   最后:依照流程图,首先客户端的conServer,发起向服务端的连接,服务端的ServerThread是提前开

      启的,ServerThread线程接受客户端的连接,新建一个ClientThread线程为这个新连接的客户端服务

      这里的服务是接受这个客户端的信息,和向这个客户端发送信息,同时呢,在遥远的青青草原

      上的客户端也会开启一个线程,它就是MessageThread,专门用来接收来自服务端对应的           ClientThread线程发来的消息。


      为什么这样呢,因为这样服务端每次接收到新的客户端的连接,就会为它分配一个ClientThread线程

      我们在服务端维护这个ClientThread线程列表,就可以区分每个客户端了,由于每个客户端在服务器

      都有一个对应的ClientThread线程,所以客户端发送的信息也不会乱。


最后我们来看看流程图中的代码,也是这个聊天室的核心


  //服务器线程,用来接收用户登录
    class ServerThread extends Thread {

        private boolean ifopen;

        private ServerSocket serverSocket;

        public ServerThread() {
            this.ifopen = true;
        }

        @Override
        public void run() {
            try {
                serverSocket = new ServerSocket(port);
                JOptionPane.showMessageDialog(su.getJframe(), "服务器成功启动");
                while (ifopen) {
                    Socket clnSocket = serverSocket.accept();//阻塞接收客户端的连接
                    if (userList.size() == max) {

                        su.getShowMessage().append("有客户端尝试连接服务端,但在线人数已达上限" + ServerUtil.getTime() + "\r\n");

                        clnSocket.close();
                        continue;
                    }

                    //每个客户端都有对应的线程处理
                    ClientThread client = new ClientThread(clnSocket);
                    su.getListModel().addElement(client.user.getName());//用户列表更新
                    userList.put(client.getUser().getName(), client);
                    client.start();
                }

            } catch (BindException be) {
                JOptionPane.showMessageDialog(su.getJframe(), "端口已经被占用,请重新启动!", "error", JOptionPane.ERROR_MESSAGE);
                return;
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        public ServerSocket getServerSocket() {
            return serverSocket;
        }

        public void setIfopen(boolean ifopen) {
            this.ifopen = ifopen;
        }
    }

    //<!----------------------------------ClientThread类分割线---------------------------------------------------------->
    /*
    每个连接到服务器的Client,都有一个线程来单独处理,接受消息
     */
    class ClientThread extends Thread {

        private ObjectOutputStream oos;
        private ObjectInputStream ois;
        private Socket socket;
        private User user;
        private boolean ifopen;

        public void PrivateSend(String message) {

        }
//        每个客户端对应一个客户端线程处理

        public ClientThread(Socket socket) {
            this.ifopen = true;
            this.socket = socket;
            try {
                ois = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
                oos = new ObjectOutputStream(socket.getOutputStream());
                Object obj = ois.readObject();//读取用户信息包------------------------------------读取包

                DataBag db = (DataBag) obj;//取得数据包,第一个数据包存储了用户的信息
                this.user = db.getUser();//首先得到登录用户的信息

                //通知其他客户端,新用户上线
                BagTarget bt = new BagTarget();
                bt.setOption(GROUP_CHAT);
                bt.setGroupOption(USER_ADD);
                db.setBt(bt);//----------------------3目的地数据
                GroupSend(db);//--------------------------------------------向其他在线用户群发有新的用户登录包

                //向刚登录的用户发送当前在线的用户列表
                if (userList.size() > 0) {
                    DataBag dblist = new DataBag();
                    HashMap<String, User> onlineUser = new HashMap<String, User>();
                    Iterator iter = userList.entrySet().iterator();

                    while (iter.hasNext()) {

                        Map.Entry entry = (Map.Entry) iter.next();
                        String key = (String) entry.getKey();

                        ClientThread val = (ClientThread) entry.getValue();
                        onlineUser.put(key, val.getUser());
                    }
                    dblist.setUserlist(onlineUser);//-----------------------4在线的用户
                    BagTarget btList = new BagTarget();
                    btList.setOption(GROUP_CHAT);
                    btList.setGroupOption(USER_LIST);
                    dblist.setBt(btList);//曾经的bug出错点-------------------------------------bug     bug           bug------------------------------>
                    oos.writeObject(dblist);
                    oos.flush();

                }

            } catch (Exception ex) {
                System.out.println(ex.getMessage());
                ex.printStackTrace();
            }

        }


  //<----------------------------------------消息接收类---------------------------------------------->
    //全天候接受信息

    class MessageThread extends Thread {

        private boolean ifopen;

        public MessageThread() {
            this.ifopen = true;
        }

        @Override
        public void run() {
            try {
                oos = new ObjectOutputStream(socket.getOutputStream());
                ois = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
                //先发送自身的信息给服务器
                DataBag db = new DataBag();
                db.setUser(user);
                oos.writeObject(db);
                oos.flush();

                while (ifopen) {

                    Object obj = ois.readObject();

                    db = (DataBag) obj;
                    int option = db.getBt().getOption();//判断是私聊还是群聊
                    switch (option) {
                        case GROUP_CHAT:
                            GroupChat(db);
                            break;
                        case PRIVATE_CHAT:
                            PrivateRecv(db);
                            break;
                        default:
                    }

                }
            } catch (Exception ex) {
                System.out.println(ex.getMessage());
                ex.printStackTrace();
            }

        }




各位看官有问题的话请评论留言,我有空就过来回答










                                    


                                     

 

                              


                

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java socket聊天室 swing做界面 Tcp为通讯协议 支持私聊 群聊 发文件 的相关文章

  • tomcat下部署jenkins

    tomcat简介 Tomcat是Apache 软件基金会 Apache Software Foundation 的Jakarta 项目中的一个核心项目 由Apache Sun 和其他一些公司及个人共同开发而成 由于有了Sun 的参与和支持
  • 敏捷开发---故事拆解

    很多时候 故事拆解利用模块化处理方式执行 但是跟多事小团队内部协商进行ac处理 体验问题的处理 这种弊端是 缺乏故事完整性 建议 采用全面鱼骨特性 进行小团队作战
  • 理解Python中的with…as…语法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 更详细的参考 http www ibm com developerworks cn opensource os cn pythonwith http blog csdn n
  • padStart()与padEnd()

    padStart padStart 方法 用另一个字符串填充当前字符串 如果需要的话 会重复多次 以便产生的字符串达到给定的长度 从当前字符串的左侧开始填充 语法 str padStart targetLength padString 参数
  • JTS:02 使用WKB操作数据

    版本 org locationtech jts jts core 1 19 0 链接 github 代码 import org locationtech jts geom Coordinate import org locationtech
  • 高德地图通过图层layer实现对海量点的可视化渲染

    一 可视化海量点应用场景 在正文开始之前我先说说我为啥会使用这个技术来实现数据的可视化 事情是这样的 我接手了一个项目 里面有个需求是在地图上标记出他们公司的产品的使用分布 我接手的时候呢 我前面的那位大哥是使用marker点覆盖物 加上f
  • Navigation Preview unavailable in Android Studio 3.4 Preview

    Navigation Preview unavailable in Android Studio 3 4 Preview 最近在学Jetpack Navigation组件 但是在写navigation资源文件的时候 Preview 显示不出
  • 周更计划----web安全学习

    本周做题 ctfshow web入门 信息搜集1 18 目录 web1 web2 web3 web4 web5 web6 web7 web8 web9 web10 web11 web12 web13 web14 web15 web16 we
  • mysql多表查询

    多表关系分类 一对一 任意一方添加外键 关联另外一方的主键 并且设置外键唯一unique 一对多 多对一 在多的一方建立外键 指向一的一方的主键 多对多 将两张表的主键提取出来建立一张中间表 直接查询 会产生无效的笛卡尔积 select f
  • physx选择显卡还是cpu_玩转显卡,再也不用担心被坑

    对于显卡 相信大家都不陌生 无论是玩游戏 还是从事专业的图形设计 有一块好显卡才能如有神助 所以 今天小编就来带大家认识一下显卡本卡 01 什么是显卡 从字面上理解显卡是显示接口卡 显卡英文全称Video card或Graphic card
  • 解决Maven打包报错Could not transfer artifact xxx.xxx找不到依赖的问题

    解决Maven打包报错Could not transfer artifact xxx xxx找不到依赖的问题 概述 方案一 方案二 方案三 作者使用的这种方案 命令事例 概述 当我用idea导入一个新的maven项目 配置好maven仓库
  • 浏览器控制台报错net::ERR_CONNECTION_RESET原因:

    浏览器控制台报错net ERR CONNECTION RESET原因 浏览器控制台报错net ERR CONNECTION RESET原因 浏览器控制台错误 101 net ERR CONNECTION RESET 的本身含义就是这个网站存

随机推荐

  • Web前端开发技术课程大作业,期末考试

    Web前端开发技术课程大作业 期末考试 作业要求 最终界面 部分代码呈现 index html login html index css login css swithpic js 完整代码素材下载 作业要求 网站前端程序不仅要能够把用户要
  • linux下使用sed命令将文件的LF转为CRLF

    linux下使用sed命令将文件的CRLF转为LF 只要将每行中 r变成空就OK 以下命令为将file中的CRLF转为LF sed i s r g file 以下命令为将目录中 c文件和 h文件中的CRLF转为LF find regex c
  • 牛客SQL34: 牛客直播各科目同时在线人数(最大值问题)

    牛客SQL34 牛客直播各科目同时在线人数 最大值问题 内容目录 牛客SQL34 牛客直播各科目同时在线人数 最大值问题 一 描述 二 思路解析 三 代码 四 问题思考 一 描述 牛客某页面推出了数据分析系列直播课程介绍 用户可以选择报名任
  • 考研OS备考

    本文主要是考研复试备考自用 所以课后习题答案主要是简答题部分 此外还有其他的简答补充 如果发现有误 欢迎在评论区或者私信指出 计算机操作系统 汤小丹慕课版 课后习题答案 考研备考 第1章 操作系统引论 第1章 课后习题答案 第1章 零碎知识
  • 性能计数器

    性能计数器 Performance Object Counter Description Processor processor Time 指处理器执行非闲置线程时间的百分比 测量处理器繁忙的时间 这个计数器设计成用来作为处理器活动的主要指
  • 成都亚恒丰创科技USB-CAN和CAN分析仪接口方式

    USB CAN和CAN分析仪接口方式 导语 随着现代汽车电子技术的飞速发展 CAN总线成为了汽车领域中最常用的通信协议 而在进行CAN总线的调试和分析时 CAN分析仪是一种必不可少的工具 本文将介绍USB CAN接口和CAN分析仪的基本原理
  • Spring参数校验--List<E>类型参数校验

    1 遇到的问题 今天开发接口 遇到请求参数固定为List
  • 2023年第三届能源、电力与电气工程国际会议 (CoEEPE 2023)

    会议简介 Brief Introduction 2023年第三届能源 电力与电气工程国际会议 CoEEPE 2023 会议时间 2023年11月22日 24日 召开地点 澳大利亚 墨尔本 大会官网 www coeepe org 2023年第
  • Javascript:谈谈JS的全局变量跟局部变量

    今天公司一个实习小妹子问我两段JS代码的区别 我想 好简单
  • 干货分享:六个知名的Go语言web框架

    框架一直是敏捷开发中的利器 能让开发者很快的上手并做出应用 甚至有的时候 脱离了框架 一些开发者都不会写程序了 成长总不会一蹴而就 从写出程序获取成就感 再到精通框架 快速构造应用 当这些方面都得心应手的时候 可以尝试改造一些框架 或是自己
  • 【华为OD机试】 阿里巴巴找黄金宝箱(I)【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上 无意中发现了强盗集团的藏宝地 藏宝地有编号从0 N的箱子 每个箱子上面贴有一个数字 箱子中可能有一个黄金宝箱 黄金宝箱满足排在它
  • BurpSuite实战教程01-web渗透安全测试(靶场搭建及常见漏洞攻防)

    渗透测试 渗透测试 Penetration test 即安全工程师模拟黑客 在合法授权范围内 通过信息搜集 漏洞挖掘 权限提升等行为 对目标对象进行安全测试 或攻击 最终找出安全风险并输出测试报告 Web渗透测试分为白盒测试和黑盒测试 白盒
  • 在浏览器输入URL,按下回车之后的流程?

    1 在浏览器中输入一个URL 2 查找本地配置文件 如果之前有访问过 浏览器会进行缓存 如果没有的话会在本机域名解析文件hosts文件中寻找是否存在该URL的域名映射 如Windows的配置文件 C Windows System32 dri
  • NIO初级例子

    NIO初级例子 前言 一 代码撸上 前言 使用window系统环境 window 环境测试 测试使用telnet ip 端口 win R cmd 输入telnet id port Ctrl send 发送信息 缺点 无阻塞 但是cpu空转
  • UE4_代理示例_时钟

    时钟 TimeOfDayHandler 注册代理 执行代理 Fill out your copyright notice in the Description page of Project Settings pragma once inc
  • 陇原战“疫“2021网络安全大赛 Web EasyJaba

    陇原战 疫 2021网络安全大赛 Web EasyJaba 文章目录 陇原战 疫 2021网络安全大赛 Web EasyJaba 不出网 参考链接 查看源码 禁用了一些类 这里说一下反编译工具的情况 之前我一直用的jd gui 但是本题的附
  • SQLi-LABS(21~25a关详解)

    SQLi LABS Less 21 查看题目环境 登陆给我回显的数据是I LOVE YOU COOKIES 这题看了网上的wp才知道原来是将我们的uname和passwd都进行base64编码 表示不知道怎么看出来的 Cookie unam
  • StandardScaler函数用法

    StandardScaler 是来自 sklearn preprocessing 模块的一个类 其作用是进行特征缩放 使得所有特征的均值为 0 标准差为 1 这种处理方式也被称为数据的标准化 Standardization 或者 Z Sco
  • webView打开的页面和手机浏览器打开的不一样

    同一个url 用webView打开的和直接打开的不一样 webView打开的自动就有个商品在里面了 而且按钮也点击无效 大神们帮帮忙吧
  • java socket聊天室 swing做界面 Tcp为通讯协议 支持私聊 群聊 发文件

    Java的的的的聊天室 源代码下载 首先我们来看看程序界面 丑到爆 勉强能用就行啦 第一个 登录界面 第二个 用户界面 第三个 服务器界面 好了上面三个界面是程序的主界面 下面我们先讲讲如何使用源代码 使用条件 一数据库 我这里用的MyS