【TCP和UDP通信】多发多收

TCP和UDP通信——多发多收

UDP通信

1.客户端可以反复发送数据

客户端实现步骤

(1)创建DatagramSocket对象(发送端对象)

(2)使用while死循环不断的接收用户的数据输入,如果用户输入”886”则退出程序

(3)使用DatagramSocket对象的send方法将数据包对象进行发送

(4)释放资源

public class UDPClient {public static void main(String[] args) throws IOException {Scanner sc = new Scanner(System.in);DatagramSocket client = new DatagramSocket(); //使用随机端口while (true) {//发送的信息由键盘录入System.out.println("请输入聊天内容:");String info = sc.next();byte[] bytes = info.getBytes();DatagramPacket dp = new DatagramPacket(bytes,bytes.length,InetAddress.getByName("127.0.0.1"),20000);client.send(dp);//循环发送如果输入"886"退出if (info.contains("886")) {System.out.println("正在下线..");client.close();break;}}}
}
2.接收端可以反复接收数据
1.接受端可以反复接收数据

接收端实现步骤

(1)创建DatagramSocket对象并指定端口(接收端对象)

(2)创建DatagramSocket对象接收数据(数据包对象)

(3)使用DatagramSocket对象的receive方法传入DatagramPacket对象

(4)暂且不释放资源,使用while死循环不断的进行第3步

public class UDPServer {public static void main(String[] args) throws IOException {System.out.println("=== 聊天室 ===");DatagramSocket server = new DatagramSocket(20000);//循环接收while (true) {byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);server.receive(dp);//展示数据System.out.println(new String(bytes,0, dp.getLength()));//DatagramPacket对象获取客户端其他信息System.out.println(dp.getAddress().getHostAddress() + "/" + dp.getPort());//不要关闭服务器Socket对象,否则只能接一次System.out.println("-------------------");}}
}

TCP通信

1.客户端可以反复发送数据

实现步骤:

(1)客户端使用死循环,让用户不断输入消息

(2)服务端也使用死循环,控制服务端接收完消息,继续等到接收下一个消息

public class TCPClient {public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);Socket client = new Socket("127.0.0.1", 8888);OutputStream os = client.getOutputStream();DataOutputStream dos = new DataOutputStream(os);while (true) {System.out.println("请输入联调内容:");String info = sc.next();dos.writeUTF(info);dos.flush();//循环发送如果输入"886"退出if (info.contains("886")) {System.out.println("正在下线..");client.close();dos.close();break;}}}
}
2.接收端可以反复接收数据
public class TCPServer {public static void main(String[] args) throws Exception {System.out.println("=== 聊天室 ===");ServerSocket server = new ServerSocket(8888);Socket serverSocket = server.accept();InputStream is = serverSocket.getInputStream();DataInputStream dis = new DataInputStream(is);//循环接收while (true) {try {String info = dis.readUTF(); //有用户下线,会抛异常SocketExceptionSystem.out.println(info);} catch (Exception e) {//有人下线则释放资源System.out.println(serverSocket.getRemoteSocketAddress() + "离线了");System.out.println("-----------------------");server.close();dis.close();break;}}}
}

TCP通信-支持与多个客户端同时通信(多线程)

如何实现服务端同时接收多个客户端的消息的?

  • 主线程定义了循环负责接收客户端Socket管道连接
  • 没接收到一个Socket通信管道后分配给一个独立的线程负责处理它

客户端:

public class TCPClient {public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);Socket client = new Socket("127.0.0.1", 8888);OutputStream os = client.getOutputStream();DataOutputStream dos = new DataOutputStream(os);while (true) {System.out.println("请输入联调内容:");String info = sc.next();dos.writeUTF(info);dos.flush();//循环发送如果输入"886"退出if (info.contains("886")) {System.out.println("正在下线..");client.close();dos.close();break;}}}
}

任务类:封装本次连接的客户端要完成的逻辑

public class ServerThread implements Runnable {//serverSocket:本次连接的客户端的Socket对象private Socket serverSocket;public ServerThread(Socket serverSocket) {this.serverSocket = serverSocket;}@Overridepublic void run() {try {//接收数据InputStream is = serverSocket.getInputStream();DataInputStream dis = new DataInputStream(is);//循环接收while (true) {try {String info = dis.readUTF(); //有用户下线,会抛异常SocketExceptionSystem.out.println(info);} catch (Exception e) {//有人下线则释放资源System.out.println(serverSocket.getRemoteSocketAddress() + "离线了");System.out.println("-----------------------");serverSocket.close();dis.close();break;}}} catch (IOException e) {e.printStackTrace();}}
}

服务端:使用线程循环接收

package com.demo12_TCP多发多收_多线程实现;// TODO: 能够完成TCP通信下服务端可以同时接收多个客户端的消息import java.net.ServerSocket;
import java.net.Socket;public class TCPServer {public static void main(String[] args) throws Exception {System.out.println("=== 聊天室 ===");ServerSocket server = new ServerSocket(8888);while (true) {Socket serverSocket = server.accept();//每当服务器监听到一个连接请求,获取serverSocket对象,开启一个线程处理任务new Thread(new ServerThread(serverSocket)).start();}}
}

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

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

相关文章

车牌文本检测与识别:License Plate Recognition Based On Multi-Angle View Model

论文作者:Dat Tran-Anh,Khanh Linh Tran,Hoai-Nam Vu 作者单位:Thuyloi University;Posts and Telecommunications Institute of Technology 论文链接:http://arxiv.org/abs/2309.12972v1 内容简介: 1)方向&#x…

可以动态改变刻度背景色的车速仪表盘

最近做的项目的主页面需要用到一个仪表盘来动态显示车速,同时改变对应的背景色 仪表盘 开始是想着使用echarts,修修改改拿来用,但是人家客户有规定,必须搞个差不多的,那没办法,自 己动手搞个吧 截图如下&am…

多源最短路径的原理及C++实现

时间复杂度 O(n3),n是端点数。 核心代码 template<class T, T INF 1000 * 1000 * 1000> class CNeiBoMat { public: CNeiBoMat(int n, const vector<vector<int>>& edges,bool bDirectfalse,bool b1Base false) { m_vMat.assign(n, vector<…

2023年【R2移动式压力容器充装】模拟考试及R2移动式压力容器充装模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装模拟考试考前必练&#xff01;安全生产模拟考试一点通每个月更新R2移动式压力容器充装模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过R2移动式压力容器充装操作证考试很简单。 1…

MySQL5.7版本与8.0版本在Ubuntu(WSL环境)系统安装

目录 前提条件 1. MySQL5.7版本在Ubuntu&#xff08;WSL环境&#xff09;系统安装 1. 1 下载apt仓库文件 1.2 配置apt仓库 1.3 更新apt仓库的信息 1.4 检查是否成功配置MySQL5.7的仓库 5. 安装MySQL5.7 1.6 启动MySQL 1.7 对MySQL进行初始化 1.7.1 输入密码 …

PDF文件压缩软件 PDF Squeezer mac中文版​软件特点

PDF Squeezer mac是一款macOS平台上的PDF文件压缩软件&#xff0c;可以帮助用户快速地压缩PDF文件&#xff0c;从而减小文件大小&#xff0c;使其更容易共享、存储和传输。PDF Squeezer使用先进的压缩算法&#xff0c;可以在不影响文件质量的情况下减小文件大小。 PDF Squeezer…

排序算法之【快速排序】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

[sping] spring core - 依赖注入

[sping] spring core - 依赖注入 所有代码实现基于 Spring Boot3&#xff0c;core 的概念很宽广&#xff0c;这里的 core concept 主要指的就是 Inversion of Control 和 Dependency Injection&#xff0c;其他的按照进度应该是会被放到其他的 section 记录 之前有写过 IoC 和…

MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving

MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving&#xff08;基于神经辐射场的自动驾驶仿真器&#xff09;https://github.com/OPEN-AIR-SUN/marshttps://arxiv.org/pdf/2307.15058.pdfhttps://mp.weixin.qq.com/s/6Ion_DZGJwzs8JOoWMMbPw …

Ubuntu基于Docker快速配置GDAL的Python、C++环境

本文介绍在Linux的Ubuntu操作系统中&#xff0c;基于Docker快速配置Python与C 这2种不同编程语言可用的地理数据处理库GDAL开发环境的方法。 本文就将Python与C 这2种不同编程语言的GDAL模块配置方法分开来介绍&#xff0c;大家依据自己的需求来选择即可——但无论是哪种方法&a…

计算机竞赛 目标检测-行人车辆检测流量计数

文章目录 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 行人车辆目标检测计数系统 …

springmvc-JSR303进行服务端校验分组验证SpringMVC定义Restfull接口异常处理流程RestController异常处理

目录& 1. JSR303 2. JSR303中含有的注解 3. spring中使用JSR303进行服务端校验 3.1 导入依赖包 3.2 添加验证规则 3.3 执行校验 4. 分组验证 4.1 定义分组验证规则 4.2 验证时通过参数指定验证规则 4.3 验证信息的显示 5. SpringMVC定义Restfull接口 5.1 增加s…

opentelemetry、grafana、Prometheus、jaeger、victoria-metrics 介绍、关系与使用

Opentelemetry OTEL 是 OpenTelemetry 的简称&#xff0c; 是 CNCF 的一个可观测性项目&#xff0c;旨在提供可观测性领域的标准化方案&#xff0c;解决观测数据的数据模型、采集、处理、导出等的标准化问题&#xff0c;提供与三方 vendor 无关的服务。 OpenTelemetry 是一组标…

postgresql新特性之Merge

postgresql新特性之Merge 创建测试表测试案例 创建测试表 create table cps.public.test(id integer primary key,balance numeric,status varchar(1));测试案例 官网介绍 merge into test t using ( select 1 id,0 balance,Y status) s on(t.id s.id) -- 当匹配上了,statu…

TempleteMethod

TempleteMethod 动机 在软件构建过程中&#xff0c;对于某一项任务&#xff0c;它常常有稳定的整体操作结构&#xff0c;但各个子步骤却有很多改变的需求&#xff0c;或者由于固有的原因 &#xff08;比如框架与应用之间的关系&#xff09;而无法和任务的整体结构同时实现。如…

嵌入式Linux应用开发-驱动大全-同步与互斥①

嵌入式Linux应用开发-驱动大全-同步与互斥① 第一章 同步与互斥①1.1 内联汇编1.1.1 C语言实现加法1.1.2 使用汇编函数实现加法1.1.3 内联汇编语法1.1.4 编写内联汇编实现加法1.1.5 earlyclobber的例子 1.2 同步与互斥的失败例子1.2.1 失败例子11.2.2 失败例子21.2.3 失败例子3…

使用CrawlSpider爬取全站数据。

CrawpSpider和Spider的区别 CrawlSpider使用基于规则的方式来定义如何跟踪链接和提取数据。它支持定义规则来自动跟踪链接&#xff0c;并可以根据链接的特征来确定如何爬取和提取数据。CrawlSpider可以对多个页面进行同样的操作&#xff0c;所以可以爬取全站的数据。CrawlSpid…

【2023年11月第四版教材】第17章《干系人管理》(合集篇)

第17章《干系人管理》&#xff08;合集篇&#xff09; 1 章节内容2 管理基础3 管理过程3.1 管理的过程★★★ &#xff08;22上44&#xff09;3.2 管理ITTO汇总★★★ 4 过程1-识别干系人4.1 数据收集★★★4.3数据分析4.4 权力利益方格4.5 数据表现&#xff1a;干系人映射分析…

springmvc中DispatcherServlet关键对象

以下代码为 spring boot 2.7.15 中自带的 spring 5.3.29 RequestMappingInfo 请求方法相关信息封装&#xff0c;对应的信息解析在 RequestMappingHandlerMapping 的 createRequestMappingInfo() 中实现。 对于 RequestMapping 赋值的相关信息进行解析 protected RequestMappi…