【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.mzph.cn/news/93958.shtml

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

相关文章

ES / Kibana 快速安装配置记录

ES / Kibana 快速安装配置记录 支持一览表 | Elastic Download Elasticsearch | Elastic Download Kibana Free | Get Started Now | Elastic wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repowget -O /etc/yum.repos.d/epel-7.rep…

对图像中边、线、点的检测(支持平面/鱼眼/球面相机)附源码

前言 图像的线段检测是计算机视觉和遥感技术中的一个基本问题,可广泛应用于三维重建和 SLAM 。虽然许多先进方法在线段检测方面表现出了良好的性能,但对未去畸变原始图像的线 段检测仍然是一个具有挑战性的问题。此外,对于畸变和无畸变的图像都缺乏统一的…

1.2.C++项目:仿muduo库实现并发服务器之时间轮的设计

文章目录 一、为什么要设计时间轮?(一)简单的秒级定时任务实现:(二)Linux提供给我们的定时器:1.原型2.例子 二、时间轮(一)思想(一)代码 一、为什…

Android AMS——Activity Pause(八)

在前面的文章《Android AMS——ATMS解析(四)》中,介绍了 Activity 的启动流程,其中调用到 Task.resumeTopActivityInnerLocked() 时,会先调用 startPausingLocked 暂停前一个 Activity,在启动新的 Activity。 这里我们就看以下 Activity 的暂停流程。 一、Activity暂停流…

云原生数据库TDSQL-C

数据库系统核心模块 云原生数据库要解决什么问题? HTAP 云数据库VS云原生数据库

mysql双主互从通过KeepAlived虚拟IP实现高可用

mysql双主互从通过KeepAlived虚拟IP实现高可用 在mysql 双主互从的基础上, 架构图: Keepalived有两个主要的功能: 提供虚拟IP,实现双机热备通过LVS,实现负载均衡 安装 # 安装 yum -y install keepalived # 卸载 …

Polygon Miden交易模型:Actor模式 + ZKP => 并行 + 隐私

1. 引言 前序博客: Polygon Miden:扩展以太坊功能集的ZK-optimized rollupPolygon Miden zkRollup中的UTXO账户混合状态模型 Polygon Miden为: ZK-optimized rollup由客户端生成证明完善Polygon ZK系列解决方案,致力于成为网络…

【C语言经典100例题-68】有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数

方法一 将原数组拆成两部分&#xff0c;前面n-m个数和后面m个数。首先将前面n-m个数逆序&#xff0c;然后将后面的m个数逆序。最后将整个数组逆序即可。 #include <stdio.h>void reverse(int arr[], int start, int end) {for (int i start, j end; i < (start en…

学过的汇编指令整合

1.数据搬移指令 <opcode>{<cond>}{s} <Rd>, <shifter_operand> 解释&#xff1a; <opcode>&#xff1a;指令码 {<cond>}&#xff1a;条件码 {s}&#xff1a;状态位&#xff0c;如果在指令后面加上s&#xff0c;则运算的结果会影响CPSR的条…

傅里叶系列 P2 的定价选项

系列上文&#xff1a;傅里叶系列 P1 的定价选项_无水先生的博客 一、说明 通过本文&#xff0c;您可以了解&#xff1a; 如何从知道什么是傅里叶级数到能够在黑色下为期权定价。 如果您想了解更多关于傅里叶级数基础知识的信息&#xff0c;请查看第 1 部分。随附笔记本&#…

objective-c 基础学习

目录 第一节&#xff1a;OC 介绍 ​​第二节&#xff1a;Fundation 框架 ​第三节&#xff1a;NSLog 相对于print 的增强 ​第四节&#xff1a;NSString ​第五节&#xff1a;oc新增数据类型 第六节&#xff1a; 类和对象 ​类的方法的声明与实现 ​第七节&#xff1a;类…

pytorch各种loss函数

pytorch各种loss函数 各种loss函数各种loss函数 Loss Functionsnn.L1Loss创建一个标准来测量输入中每个元素x和目标y之间的平均绝对误差(MAE)nn.MSELoss创建一个标准,用于测量输入中每个元素x和目标y之间的均方误差(L2范数的平方)。nn.CrossEntropyLoss该准则计算输入logits与…

如何在Go中格式化字符串

由于字符串通常由书面文本组成&#xff0c;在很多情况下&#xff0c;我们可能希望通过标点符号、换行和缩进来更好地控制字符串的外观&#xff0c;以使其更易于阅读。 在本教程中&#xff0c;我们将介绍一些处理go字符串的方法&#xff0c;以确保所有输出文本的格式正确。 字…

智慧公厕整体解决方案,厕所革命实施方案的范本

随着城市化进程的不断加快&#xff0c;智慧城市应用正成为未来城市发展的重要方向。其中&#xff0c;智慧公厕作为城市基础设施的重要组成部分&#xff0c;其建设范本已经成为各建设中的智慧城市不可或缺的重要内容。那么&#xff0c;如何打造智慧公厕整体解决方案&#xff1f;…

将数组和减半的最少操作【贪心2】

题目&#xff1a;将数组和减半的最少操作 贪心思路&#xff1a;每次挑选最大的数来减半。 解法&#xff1a;贪心大根堆 class Solution { public:int halveArray(vector<int>& nums) {priority_queue<double> heap;double sum 0.0;for(int& x : nums){hea…

(四)激光线扫描-光平面标定

在上一章节,已经实现了对激光线条的中心线提取,并且在最开始已经实现了对相机的标定,那么相机标定的作用是什么呢? 就是将图像二维点和空间三维点之间进行互相转换。 1. 什么是光平面 激光发射器投射出一条线,形成的一个扇形区域平面就是光平面,也叫光刀面,与物体相交…

代码随想录刷题 Day28

216.组合总和III 和前一个题一样&#xff0c;照着自己就能写出来&#xff0c;就多了一个判断结果是不是等于n的逻辑。有两个地方可以剪纸&#xff0c;一个是当和已经大于要找的时候直接返回&#xff0c;另一个是当剩余元素少于三个的时候直接返回&#xff08;第一层递归是少于…

MAC 如何解决GitHub下载速度慢的问题

说在前面 解决github下载速度慢的方法很多&#xff0c;本文主要介绍通过Git镜像的方式解决下载慢的问题。 主要步骤有&#xff1a;1、找到gitconfig文件&#xff0c; 2、通过git命令查看当前生效的config 配置 3、使用git config命令编辑并添加国内镜像源 1、gitconfig 文件在…

Android etc1tool之png图片转换pkm 和 zipalign简介

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、etc1tool2.1、用法 三、zipalign3.1 使用 四…

在Mac M2本地注册GitLab runner

最近在搞公司的CI/CD&#xff0c;简单记录下部分过程 安装runner sudo curl --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-arm64" 创建runner 这个步骤需要在gitlab中进行&am…