Java基于TCP网络编程的群聊功能
服务端
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class Server2 {public static List<Socket> onlineList = new ArrayList<>();public static void main(String[] args) throws Exception{System.out.println("------------服务端启动--------------");//创建ServerSocket对象 为服务端注册端口ServerSocket socketServer =new ServerSocket(7777);while (true){//调用accept 方法等待客户端的链接请求Socket socket = socketServer.accept();onlineList.add(socket);System.out.println(socket.getRemoteSocketAddress()+"上线....");new ServerReaderThread(socket).start();}}
}
服务端的线程(用来处理客户端发来的数据)
import java.io.*;
import java.net.Socket;public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run(){try{//使用数据输入流 读取 用户发过来的信息//获取字节输入流InputStream ipt = socket.getInputStream();//把原始的字节输入流包装成数据输入流DataInputStream dis =new DataInputStream(ipt);while (true){try{String rs = dis.readUTF();System.out.println(rs);//把这个消息分发给客户端sendMsgToAll(rs);System.out.println("------------------------");}catch (Exception e){System.out.println(socket.getRemoteSocketAddress()+"下线...");dis.close();break;}}}catch (Exception e){e.printStackTrace();}}private void sendMsgToAll(String msg) throws Exception {for (Socket socket1 : Server2.onlineList) {OutputStream os =socket1.getOutputStream();DataOutputStream dos = new DataOutputStream(os);dos.writeUTF(msg);dos.flush();}}
}
客户端
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client2 {public static void main(String[] args) throws Exception {//创建一个socket 对象 并同时请求与服务端程序的链接Socket socket = new Socket("127.0.0.1",7777);//创建一个独立的线程 来读取 服务端发给客户端的消息new ClientReaderThread(socket).start();//从socket管道中获取字节流 用来发数据给服务端OutputStream os = socket.getOutputStream();//把低级的字节输出流 换成数据输出流DataOutputStream dos = new DataOutputStream(os);//开始写数据Scanner sc =new Scanner(System.in);while (true){System.out.println("user:");String msg =sc.nextLine();if("exit".equals(msg)){System.out.println("退出会话...");dos.close();//释放连接资源socket.close();break;}dos.writeUTF(msg);dos.flush();}}
}
客户端的线程(用于服务端推送的数据)
import java.io.DataInputStream;
import java.io.InputStream;
import java.net.Socket;public class ClientReaderThread extends Thread{private Socket socket;public ClientReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run (){try{//使用数据输入流 读取 用户发过来的信息//获取字节输入流InputStream ipt = socket.getInputStream();//把原始的字节输入流包装成数据输入流DataInputStream dis =new DataInputStream(ipt);while (true){try{String rs = dis.readUTF();System.out.println(rs);System.out.println("------------------------");}catch (Exception e){System.out.println(socket.getRemoteSocketAddress()+"下线...");dis.close();break;}}}catch (Exception e){e.printStackTrace();}}
}
效果

此篇基于:
Java网络编程---TCP-CSDN博客
Java网络编程TCP多线程实现服务端接受多个客户端的信息-CSDN博客
实现.....
相关文章:
Java基于TCP网络编程的群聊功能
服务端 import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List;public class Server2 {public static List<Socket> onlineList new ArrayList<>();public static void main(String[] args) throws Except…...
CentOS+ISCSI
九、配置iSCSI 添加1块大小为10G的虚拟硬盘; 安装iSCSI服务端targetcli; 使用新增加的硬盘创建卷组,名称为iscsivg,再创建iSCSI共享逻辑卷,逻辑 卷名称为iscsistore,大小为5G; 使用上述逻辑卷创建后端存储,名称为serverc.iscsistore; 定义iSCSI的IQN为iqn.2022-…...
RHCE9学习指南 第11章 网络配置
11.1 网络基础知识 一台主机需要配置必要的网络信息,才可以连接到互联网。需要的配置网络信息包括IP,子网掩码,网关和DNS。 11.1.1 IP地址 在计算机中对IP的标记使用的是32bit的二进制,例如, 11000000 10101000 00…...
Qt如何在控制台项目中使用opencv打开视频
Qt如何在控制台项目中使用opencv打开视频? 重要代码: 1、在pro文件中这样设置: QT - gui QT core widgets serialport 2、不要继承和使用:QCoreApplication #include pro文件: cpp QT - gui QT core widgets seria…...
Node.js 默认包管理器 npm 详解
目录 npm 概念 npm 命令 npm init npm install npm update npm uninstall npm search npm run other npm 安装 yarn npm 安装 yarn 和 npm 安装项目依赖 websocket 本质区别 npm 概念 npm(Node Package Manager)是一个用于管理 JavaScript 包…...
vue利用深拷贝解决修改不能取消的问题
vue利用深拷贝解决修改不能取消的问题 在对某数据进行修改时考虑还需要进行“确认”、“取消”操作,那么在取消时就需要返回保留的数据内容,那么如何将原有数据保留一份则是关键性问题。 显然修改值不能直接进行原值的赋值操作,因为这样无法取…...
MATLAB - 使用 YOLO 和基于 PCA 的目标检测,对 UR5e 的半结构化智能垃圾箱拣选进行 Gazebo 仿真
系列文章目录 前言 本示例展示了在 Gazebo 中使用 Universal Robots UR5e cobot 模拟智能垃圾桶拣选的详细工作流程。本示例提供的 MATLAB 项目包括初始化、数据生成、感知、运动规划和积分器模块(项目文件夹),可创建完整的垃圾桶拣选工作流…...
个性化定制的知识付费小程序,为用户提供个性化的知识服务,知识付费saas租户平台
明理信息科技知识付费saas租户平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和…...
基于flask和echarts的新冠疫情实时监控系统源码+数据库,后端基于python的flask框架,前端主要是echarts
介绍 基于flask和echarts的新冠疫情实时监控系统 软件架构 后端基于python的flask框架,前端主要是echarts 安装教程 下载到本地,在python相应环境下运行app.py,flask项目部署请自行完成 使用说明 flaskProject文件夹中 app.py是flask项目主运行文…...
总结js中遍历对象属性的方法
方法介绍 1、 forin循环:遍历对象自身的和原型链上的可枚举属性。 2、Object.getOwnPropertySymbols()方法:返回一个数组,包含对象自身的所有Symbol类型的属性。 3、 Object.getOwnPropertyNames()方法:返回一个数组࿰…...
编写fastapi接口服务
FastAPI是一个基于 Python 的后端框架,该框架鼓励使用 Pydantic 和 OpenAPI (以前称为 Swagger) 进行文档编制,使用 Docker 进行快速开发和部署以及基于 Starlette 框架进行的简单测试。 step1:安装必要库 pip install fastapi uvicorn st…...
RasaGPT对话系统的工作原理
RasaGPT 结合了 Rasa 和 Langchain 这 2 个开源项目,当超出 Rasa 现有意图(out_of_scope)的时候,就会执行 ActionGPTFallback,本质上就是利用 Langchain 做了一个 RAG,调用 LLM API。RasaGPT 涉及的技术栈比较多而复杂,…...
C++设计模式 #7 工厂方法(Factory Method)
“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持创建的稳定。它是接口抽象之后的第一步工作。 动机 在软件系统中,经常面临着创…...
信息网络协议基础-接入网技术
文章目录 概述***基于ATM架构虚电路PVC和SVC信元格式为什么信元格式由AAL决定?网络架构传统电信网络:点对点链路PPP协议协议内容消息过程多协议封装功能电话网接入Internet(DSL 数字用户线路)主要接入技术ADSL关键技术DMTDSLAM体系结构PPPOE帧格式过程特点局域网定义参考模型L…...
springboot 自动装配原理
在理解springboot自动装配之前需要了解spring的Configuration原理和Conditional两个注解原理。可以看下以前写的这两篇文章 spring 源码阅读之Configuration解析 spring使用Conditional进行条件装配 spring的SPI机制之使用SpringFactoriesLoader加载服务实现 SpringBootApp…...
前端---表格标签
1. 表格的结构 表格是由行和列组成,好比一个excel文件 2. 表格标签 <table>标签:表示一个表格 <tr>标签:表示表格中的一行 <td>标签:表示表格中的列<th>标签:表示表格中的表头 示例代码: &l…...
【软件工程】可执行文件和数据分离
一、概述 可执行文件和数据分离是一种软件设计策略,旨在将程序代码和程序使用的数据分离存储。这种方法通常用于提高软件的模块化程度和灵活性,以及方便软件的管理和维护。 在可执行文件和数据分离中,程序代码通常以可执行文件的形式存储&a…...
Linux dirs命令
Linux dirs命令用于显示目录记录。 显示目录堆叠中的记录。 语法 dirs [/-n -l]参数: n 显示从左边算起第n笔的目录。-n 显示从右边算起第n笔的目录。-l 显示目录完整的记录。 实例 列出"/home/cc/Ruijie"里所有内容的详细信息。可用如下命令。 dir…...
有什么好用的C/C++源代码混淆工具?
有什么好用的C/C源代码混淆工具? 开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术,可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护,防止应用…...
iOS设备信息详解
文章目录 ID 体系iOS设备信息详解IDFA介绍特点IDFA新政前世今生获取方式 IDFV介绍获取方式 UUID介绍特点获取方式 UDID介绍获取方式 OpenUDID介绍 Bundle ID介绍分类其他 IP地址介绍获取方式 MAC地址介绍获取方式正常获取MAC地址获取对应Wi-Fi的MAC地址 系统版本获取方式 设备型…...
智能数据上下文层:让AI代理真正理解您的企业数据价值
智能数据上下文层:让AI代理真正理解您的企业数据价值 【免费下载链接】WrenAI Turn any AI Agents into world-class data analysts through the open context layer that gives AI agents grounded, governed memory, context, SQL across 20 data sources, that h…...
深度解析游戏资源加密机制:构建安全增强模块的完整实现
深度解析游戏资源加密机制:构建安全增强模块的完整实现 【免费下载链接】wuwa-mod Wuthering Waves pak mods 项目地址: https://gitcode.com/GitHub_Trending/wu/wuwa-mod WuWa-Mod作为《鸣潮》(Wuthering Waves)游戏模组开发项目,通过AES加密解…...
CANN/Ascend C 基于语言扩展层C API编程
基于语言扩展层C API编程 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https:…...
ThinkPad风扇控制终极指南:TPFanCtrl2让你的笔记本更安静更智能
ThinkPad风扇控制终极指南:TPFanCtrl2让你的笔记本更安静更智能 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 还在为ThinkPad笔记本风扇噪音而烦恼吗&…...
3步掌握DownKyi:让你的B站视频收藏效率提升300%
3步掌握DownKyi:让你的B站视频收藏效率提升300% 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)…...
Unity ShaderGraph实战指南:从美术协作到URP渲染优化
1. 为什么我劝新手别急着写Shader代码——从一个被美术追着问“这个效果能不能加”的下午说起 去年冬天,我在一家做AR教育产品的团队里做技术美术。那天下午三点,UI组的同事抱着iPad冲进我工位:“老师,这个粒子光晕要加呼吸感&…...
企业数字化破局:AI低代码为何是唯一刚需?
聊企业数字化转型,现在最绕不开的就是AI低代码。但很多技术人仍有偏见:“低代码低技术”“AI能写代码,没必要用低代码”“中小企业用不起,大企业用不上”。真相很扎心:信通院2026年数据显示,AI低代码化率已…...
Python代码性能优化实战:从循环到并发的全方位加速技巧
1. 项目概述:为什么你的Python代码总是“慢半拍”?干了这么多年开发,我见过太多同事和学员写的Python代码,功能上没问题,逻辑也清晰,但就是跑起来“慢半拍”。尤其是在处理数据清洗、批量文件操作或者实现一…...
冬季施工安全措施,附: 冬季施工总安全技术交底
冬季施工安全措施,附: 冬季施工总安全技术交底 冬季施工特点 1 冬季施工由于施工条件及环境不利,是工程质量事故的多发季节,尤以混凝土工程、钢结构工程居多。如何在冬季施工、抢赶工期的条件下保证项目的质量目标,是施工技术和施工组织的难点。 3 质量事故出现的隐蔽性…...
