仿微信项目-2-Socket模拟聊天室

利用 Socket 模拟一个服务器来统一接收和发送消息

再用 Socket 模拟若干的客户端

服务端代码:

package com.wfChat.test;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;public class SocketServer {public static void main(String[] args) {ServerSocket server = null;Map<String, Socket> CLENT_MAP = new HashMap<>();try {server = new ServerSocket(8848);System.out.println("服务已启动,等待客户端链接");while (true) {Socket socket = server.accept();String ip = socket.getInetAddress().getHostAddress();System.out.println("有客户端连接ip:" + ip + ",端口:" + socket.getPort());String clientKey = ip + socket.getPort();//将成功连接的客户端都加入 map 中CLENT_MAP.put(clientKey, socket);new Thread(() -> {while (true) {try {InputStream inputStream = socket.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String readData = bufferedReader.readLine();System.out.println("收到客户端消息->" + readData);//给所有客户端发送消息CLENT_MAP.forEach((k, v) -> {try {OutputStream outputStream = v.getOutputStream();PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"));printWriter.println(socket.getPort() + ":" + readData);printWriter.flush();} catch (Exception e) {e.printStackTrace();}});} catch (Exception e) {e.printStackTrace();break;}}}).start();}} catch (Exception e) {e.printStackTrace();}}
}

 客户端代码:

package com.wfChat.test;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;public class SocketClient {public static void main(String[] args) {Socket socket = null;try {socket = new Socket("127.0.0.1", 8848);//输出流,输出内容到服务器OutputStream outputStream = socket.getOutputStream();PrintWriter printWriter = new PrintWriter(outputStream);System.out.println("请输入内容");new Thread(() -> {while (true) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();try {printWriter.println(input);printWriter.flush();} catch (Exception e) {e.printStackTrace();break;}}}).start();//输入流,从服务器输入内容到客户端InputStream inputStream = socket.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);new Thread(() -> {while (true) {try {String readData = bufferedReader.readLine();System.out.println("收到服务端消息" + readData);} catch (Exception e) {e.printStackTrace();break;}}}).start();} catch (Exception e) {e.printStackTrace();}}
}

测试:

我们将客户端的运行设置中的允许多次运行打开(在绿色小锤子的旁边可以看到这个界面):

然后,我们先将服务器启动,再用不同的客户端发送消息

 

 

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

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

相关文章

Hive学习笔记

1 Hive基本概念 1.1 Hive定义 Hive&#xff1a;由 Facebook 开源用于解决海量结构化日志的数据统计工具。 Hive 是基于 Hadoop 的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并 提供类 SQL 查询功能。 利用MapReduce去查询数据文件中的某些内…

ESRALLY安装与使用

ESRALLY安装与使用 geonames、geopoint:都是和地理位置相关的,如果需要测试ES在地理位置处理的性能可以选用 http_logs:是http_server的,如果要测服务器日志、redis日志、apache日志可以选用 说明:esrally 自带的测试数据即为 rally_track 文件夹中的内容,主要包括: Ge…

默认路由:实现内网所有网段流量走一条默认路由访问外网

默认路由 Tip&#xff1a;默认路由一般指出口网关设备的出口路由。实现所有网段流量都走一条路由。 实验模拟&#xff1a;公司内部pc 通过出口网关 访问运营商内部 baidu服务 isp网关配置&#xff1a; <Huawei>sy Enter system view, return user view with CtrlZ. …

算法工程师重生之第四十四天(岛屿数量 深搜 广搜 岛屿的最大面积)

参考文献 代码随想录 一、岛屿数量 题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周都是水域。你可以假设矩阵外均被水包…

搭建你的私人云盘:使用File Browser与cpolar实现公网传输文件

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 File Browser是一个开源的文件管理器和文件共享工具&#xff0c;它可以帮助用户轻…

SpringBoot+Shiro权限管理

完善之前的博客里的项目&#xff0c;本博客主要讲述Shiro的权限管理模块 代码实例 引入依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.7.0</version>…

【C++】布隆过滤器的概念与特点解析

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 目录 00.引入 01.布隆过滤器的概念 特点1&#xff1a;极低的内存消耗 特点2&#xff1a;快速查询 特点3&#xff1a;假阳…

深入解析:云计算与虚拟化技术

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 # 深入解析&#xff1a;云计算与虚拟化技术 文章目录 云计算概述定义服务模型部署模型 虚拟化技术定义类型关键技术 云计算与虚…

React Router v6 中用于在导航到指定路由之前使用loader预加载数据

在 React Router v6 中&#xff0c;loader 函数用于在导航到某个路由之前预加载数据。这是非常有用的功能&#xff0c;特别是在需要从服务器获取数据并将其传递给组件的情况下。loader 函数可以帮助你提前获取数据&#xff0c;从而提高用户体验和应用性能。 loader 函数的作用…

Mybatis查询数据库,返回List集合,集合元素也是List。

#有时间需求会要求&#xff1a;查询全校的学生数据&#xff0c;且学生数据按班级划分。那么就需要List<List<user>>类型的数据。 SQL语句 SELECT JSON_ARRAYAGG(JSON_OBJECT(name , name ,BJMC, BJMC ,BJBH,BJBH)) as dev_user FROM dev_user WHERE project_id …

105. UE5 GAS RPG 搭建主菜单

在这一篇&#xff0c;我们将实现对打开游戏显示的主菜单进行搭建&#xff0c;主菜单将显示游戏主角&#xff0c;游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景&#xff0c;前面可以显示对应的UI控件&#xff0c;用于玩家操作&#…

cangjie仓颉编程语言学习Note-2.标准库学习

cangjie仓颉编程语言学习Note-2.标准库学习 当前仓颉标准库提供了几乎涵盖常见开发所使用的常见库&#xff0c;这一点很赞&#xff01; 详细模块如下&#xff1a; std: 意指标准库&#xff0c;标准库是指在编程语言中预先定义的一组函数、类、结构体等&#xff0c;旨在提供常…

时间序列预测(十八)——实现配置管理和扩展命令行参数解析器

如图&#xff0c;这是一个main,py文件&#xff0c;在此代码中&#xff0c;最开始定义了许多模型参数&#xff0c;为了使项目更加灵活和可扩展&#xff0c;便于根据不同的需求调整参数和配置&#xff0c;可以根据实际需要扩展参数和配置项。 下面是如何实现配置管理和扩展命令行…

Ubuntu用docker安装AWVS和Nessus(含破解)

Ubuntu安装AWVS(更多搜索&#xff1a;超详细Ubuntu用docker安装AWVS和Nessus) 首先安装docker&#xff0c;通过dockers镜像安装很方便&#xff0c;且很快&#xff1b;Docker及Docker-Compose-安装教程。 1.通过docker search awvs命令查看镜像&#xff1b; docker search awvs…

QT for android 问题总结(QT 5.15.2)

1.配置好的sdk&#xff0c;显示设置失败 Android SDK Command-line Tools run. Android Platform-Tools installed. Command-line Tools (latest) 版本过高导致报错 &#xff0c;下载一个低版本的latest &#xff0c;替换掉之前latest中的文件。即可&#xff0c;latest 路径如…

Jmeter5.X性能测试

Jmeter5.X性能测试 文章目录 Jmeter5.X性能测试一、掌握Http基础协议1.1 浏览器的B/S架构和C/S架构1.2 HyperText Transfer Protocol 超文本传输协议1.3 超文本传输协议Http消息体拆分讲解1.4 HTTP的九种请求方法和响应码介绍1.5 Http请求头/响应头1.6 Http常见请求/响应头cont…

软件测试基础九 (python基础)

python基础 1. 注释 1.1. 注释的作⽤ 使⽤⾃⼰熟悉的语⾔&#xff0c;在程序中对某些代码进⾏标注说明&#xff0c;增强程序的可读性。 1.2. 单⾏注释 以# 开头&#xff0c;# 右边的所有东⻄都被当做说明⽂字&#xff0c;⽽不是真正要执⾏的程序&#xff0c;只起到辅助说明…

使用Kafka构建大规模消息传递系统

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Kafka构建大规模消息传递系统 引言 Kafka 简介 安装 Kafka 创建主题 生产者 消费者 高级特性 分区 持久化 消费者组 消息确认…

AI 大模型重塑软件开发流程的未来

目录 前言1. AI 大模型简介2. AI 大模型在软件开发中的应用场景2.1 代码自动生成2.2 智能调试与错误检测2.3 软件测试的自动化2.4 文档生成与代码注释 3. AI 大模型对软件开发的优势3.1 提高开发效率3.2 提升代码质量与一致性3.3 降低学习成本 4. AI 大模型在软件开发中面临的挑…

docker镜像获取不到的问题处理

总结 国内源的限制&#xff0c;很多镜像pull失败。 我目前使用的感觉最合理的方式就是去云平台厂商买一个香港的云主机。使用弹性模式&#xff0c;就是一小时几毛钱的那种。 然后pull镜像&#xff0c;pull成功后&#xff0c;save到本地&#xff0c;然后用xshell下载下来。因为…