当前位置: 首页 > news >正文

TCP实战:即时通信-端口转发

1、即时通信是什么含义,要实现怎么样的设计?

  • 即时通信,是指一个客户端的消息发出去,其他客户端可以接收到
  • 即时通信需要进行端口转发的设计思想
  • 服务端需要把在线的Socket管道存储起来
  • 一旦收到一个消息要推送给其他管道

服务端 

package com.csdn.demo07_tcp5_sms;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;/*** 目标:实现 服务端 可以同时处理 多个客户端 的消息*/
public class ServerDemo2 {//定义一个静态的List集合存储当前全部在线的socket管道public static List<Socket> allOnlineSockets = new ArrayList<>();public static void main(String[] args) {try {System.out.println("===服务端启动成功===");//1、注册端口ServerSocket serverSocket = new ServerSocket(7777);//a.定义一个死循环由主线程负责不断的接收客户端的Socket管道连接while (true) {//2、每接收到一个客户端的Socket管道,交给一个独立的子线程负责读取消息Socket socket = serverSocket.accept();//上线逻辑System.out.println(socket.getRemoteSocketAddress() + "上线了,来了老弟!!");allOnlineSockets.add(socket);//上线完成//3、开始创建独立线程处理socketnew ServerReaderThread(socket).start();}} catch (IOException e) {throw new RuntimeException(e);}}
}class ServerReaderThread extends Thread {private Socket socket;public ServerReaderThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {//3、从socket通信管道中得到一个字节输入流InputStream is = socket.getInputStream();//4、把字节输入流包装成缓冲字符输入流进行消息的接收BufferedReader br = new BufferedReader(new InputStreamReader(is));//5、按照行读取消息String msg;while ((msg = br.readLine()) != null) {System.out.println(socket.getRemoteSocketAddress() + "发来了:" + msg);//把这个消息进行端口转发给全部客户端socket管道sendMsgToAll(msg);}} catch (IOException e) {System.out.println(socket.getRemoteSocketAddress() + "下线了,下次再来哦,老弟!!");ServerDemo2.allOnlineSockets.remove(socket);}}private void sendMsgToAll(String msg) throws IOException {for (Socket socket : ServerDemo2.allOnlineSockets) {PrintStream ps = new PrintStream(socket.getOutputStream());ps.println(msg);ps.flush();}}
}

 客户端

package com.csdn.demo07_tcp5_sms;import java.io.*;
import java.net.Socket;
import java.util.Scanner;/*** 目标:完成 Socket  客户端开发,实现 多发 和 多收*/
public class ClientDemo1 {public static void main(String[] args) {try{System.out.println("===客户端启动===");//1、创建Socket通信管道请求有服务端的连接Socket socket = new Socket("127.0.0.1", 7777);//创建一个独立的线程专门负责这个客户端的读消息(服务端随时可能转发消息过来!)new ClientReaderThread(socket).start();//2、从socket通信管道中得到一个字节输出流 负责发送数据OutputStream os = socket.getOutputStream();//3、把低级的字节流包装成打印流PrintStream ps = new PrintStream(os);Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String msg = sc.nextLine();//4、发送消息ps.println(msg);ps.flush();}} catch (IOException e) {throw new RuntimeException(e);}}
}class ClientReaderThread extends Thread {private Socket socket;public ClientReaderThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {//3、字节输入流InputStream is = socket.getInputStream();//4、把低级的字节输入流包装成高级的缓冲字符输入流BufferedReader br = new BufferedReader(new InputStreamReader(is));//5、按照行读取String line;while ((line = br.readLine()) != null) {System.out.println("收到消息" + line);}} catch (IOException e) {System.out.println("服务器把你踢出去了~~~");}}
}

相关文章:

TCP实战:即时通信-端口转发

1、即时通信是什么含义&#xff0c;要实现怎么样的设计&#xff1f; 即时通信&#xff0c;是指一个客户端的消息发出去&#xff0c;其他客户端可以接收到即时通信需要进行端口转发的设计思想服务端需要把在线的Socket管道存储起来一旦收到一个消息要推送给其他管道 服务端 pac…...

CMakeLists.txt详解

CMakeLists.txt详解 CMakeLists.txt是一个用于构建C/C项目的CMake配置文件。它定义了项目的编译选项&#xff0c;包括编译器类型、依赖库、预处理宏和子目录等。让我们逐步解析这个文件。 编译器检测 CMAKE_CXX_COMPILER_ID 变量用于检测编译器类型。在这个示例中&#xff0…...

记一个JSON返回数据的bug

记一个JSON返回数据的bug:‘Object of type int64 is not JSON serializable’ 我在打包数组进行json数据返回时&#xff0c;有一个参数是numpy数组里计算出来的&#xff0c;类型为int64&#xff0c;直接进行json打包会报错 提示(‘Object of type int64 is not JSON serializa…...

毫米波雷达模块技术革新:在自动驾驶汽车中的前沿应用

随着自动驾驶技术的快速发展&#xff0c;毫米波雷达模块的技术革新成为推动这一领域的关键因素之一。本文将深入研究毫米波雷达模块技术的最新进展&#xff0c;并探讨其在自动驾驶汽车中的前沿应用。 毫米波雷达模块的基本原理 解释毫米波雷达模块的基本工作原理&#xff0c;强…...

优秀数据库模式迁移工具的发展历程

数据库模式迁移可能是应用程序开发中风险最大的领域——因为这是一个困难的、有风险的和痛苦的过程。数据库模式迁移工具的存在是为了减轻这种痛苦&#xff0c;并且已经取得了长足的进步&#xff1a;从基本的CLI工具到GUI工具&#xff0c;从简单的SQL GUI客户端到一体化协作数据…...

【深度学习】数据集最常见的问题及其解决方案

简介 如果您还没有听过&#xff0c;请告诉您一个事实&#xff0c;作为一名数据科学家&#xff0c;您应该始终站在一个角落跟你说&#xff1a;“你的结果与你的数据一样好。” 尝试通过提高模型能力来弥补糟糕的数据是许多人会犯的错误。这相当于你因为原来的汽车使用了劣质汽…...

Excel文件带有密码的只读模式,如何设置?

Excel带有密码的除了打开密码和工作表保护以外&#xff0c;其实还有一种可以设置密码的方法&#xff0c;今天给大家分享如何设置带有密码的只读模式。 打开excel文件&#xff0c;将文件进行【另存为】设置&#xff0c;然后停留在保存路径的界面中&#xff0c;我们点击下面的工…...

【Qt之json文件】json文件介绍及相关读写类介绍、示例

JSON介绍 JSON&#xff08;JavaScript Object Notation&#xff09;是一种源自Javascript的编码对象数据的轻量级的数据交换格式&#xff0c;易于理解和编写&#xff0c;JSON但现在已广泛用作互联网上的数据交换格式。 Qt提供了处理JSON数据的支持。Qt中的JSON支持提供了一个易…...

arp 隔离

目录 问题查找解决方式参考 问题 linux 在使用双网卡系统时&#xff0c;当这两个不同网段的网口接到同一个交换机上&#xff0c;会出现 eth0 的 arp 请求&#xff0c;会在 eth1 上收到并回复&#xff0c;相当于自己检测到了自己的 ip。 查找 linux 的底层&#xff0c;默认情…...

数据结构与算法(文章链接汇总)

数据结构与算法&#xff08;一&#xff09;&#xff1a;概述与复杂度分析 数据结构与算法&#xff08;二&#xff09;&#xff1a;数组与链表 数据结构与算法&#xff08;三&#xff09;&#xff1a;栈与队列 数据结构与算法&#xff08;四&#xff09;&#xff1a;哈希表 数据…...

代码随想录算法训练营第五十九天 | 647. 回文子串、516.最长回文子序列

647. 回文子串 链接&#xff1a; 代码随想录 &#xff08;1&#xff09;代码 516.最长回文子序列 链接&#xff1a; 代码随想录 &#xff08;1&#xff09;代码...

非关系型数据库-Redis

一、缓存概念 缓存是为了调节速度不一致的两个或多个不同的物质的速度&#xff0c;在中间对速度较慢的一方起到加速作用&#xff0c;比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据&#xff0c;内存是保存CPU经常访问硬盘的数据&#xff0c;而且硬盘也有大小不一的缓存…...

HTML基本讲解与使用

目录 html的由来: 什么是HTML: HTML的主要特点: HTML文档结构: HTML元素: HTML元素属性&#xff1a; 文本和格式化&#xff1a; 链接和图像&#xff1a; 列表&#xff1a; 表格&#xff1a; 表单&#xff1a; 嵌套和结构&#xff1a; HTML注释&#xff1a; 样式…...

linux uname详解 -s -r -a 查看内核版本

简介 uname命令用于显示操作系统信息&#xff0c;例如内核版本、主机名、处理器类型等 uname常用的有-a&#xff0c;-r&#xff0c;-rs 参数 --help  显示帮助。-a 或--all 显示全部信息&#xff0c;包括内核名、主机名、内核版本、处理器类型和硬件架构等…...

Linux常用命令——cmp命令

在线Linux命令查询工具 cmp 比较两个文件是否有差异 补充说明 cmp命令用来比较两个文件是否有差异。当相互比较的两个文件完全一样时&#xff0c;则该指令不会显示任何信息。若发现有差异&#xff0c;预设会标示出第一个不通之处的字符和列数编号。若不指定任何文件名称或是…...

C语言之排序

1.冒泡排序 冒泡排序就不多说了&#xff0c;只需要两层循环嵌套&#xff0c;两两比较确定相对正确的顺序即可。 2.插入排序 插入排序的思想就是每一次向后寻找一个再将其与前面有序的部分进行对比&#xff0c;寻找合适位置插入。 这里关键要避免让前移超出目前读取的数字&…...

GitHub-使用 Git工具 创建密钥id_rsa.pub

快速导航 步骤1 打开Git Bash步骤2 输入指令【ssh-keygen】步骤3 打开创建的公钥文件步骤4 复制其中所有内容步骤5 打开GitHub中的Setting界面步骤6 添加SSH keys 步骤1 打开Git Bash 打开Git Bash 工具 步骤2 输入指令【ssh-keygen】 输入指令【ssh-keygen】&#xff0c;并…...

C++多重、多层、分层继承

在本文中&#xff0c;您将学习C 编程中的不同继承模型&#xff1a;带有示例的多继承&#xff0c;多层和分层继承。 继承是面向对象编程语言的核心功能之一。它允许软件开发人员从现有的类派生一个新的类。派生类继承基类&#xff08;现有类&#xff09;的功能。C 编程中有多种…...

ThingsBoard的数据分析-自定义节点来订阅kafka stream的消息

1、概述 在ThingsBoard官方文档中有说明:ThingsBoard 规则引擎支持对传入遥测数据的基本分析,例如阈值交叉。规则引擎背后的想法是提供基于设备属性或数据本身将数据从物联网设备路由到不同插件的功能。 然而,大多数现实生活中的用例也需要高级分析的支持:机器学习、预测分…...

Python WSGI HTTP Server - Gunicorn

基本概念 Gunicorn&#xff0c;也称为“Green Unicorn”&#xff0c;是一个Python WSGI HTTP Server&#xff0c;用于运行Python Web应用程序。WSGI&#xff08;Web Server Gateway Interface&#xff09;是Python应用程序和Web服务器之间的一个接口&#xff0c;允许应用程序和…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...