Java网络通信:UDP和TCP

一、UDP特点

  • 无连接不可靠:通信双方不事先建立连接,直接发送数据。
  • 数据封装:将数据封装在64KB的数据包中,包含接收端的IP和端口。
  • UDP通信模型
    • 模型比喻:以抛韭菜为例,发送端像抛韭菜的人,接收端像接韭菜的人,数据如韭菜,数据包如韭菜盘子。
    • 模型作用:帮助理解UDP通信过程,后续代码编写将严格按照此模型进行。

二、 UDP客户端代码实现

  • 创建发送端对象:使用DatagramSocket类创建,系统会默认分配端口。
  • 创建数据包对象:使用DatagramPacket类,封装要发送的数据,需将数据转成字节数组,指定发送长度、目的地IP和端口。
  • 发送数据包:调用DatagramSocket对象的send方法。
  • UDP服务端代码实现
    • 创建接收端对象:使用DatagramSocket类,需注册端口,与客户端指定的端口匹配。
    • 创建数据包对象:使用DatagramPacket类,准备字节数组接收数据,大小最好设置为64KB。
    • 接收数据:调用DatagramSocket对象的receive方法,将数据封装到数据包对象的字节数组中。
    • 处理数据:获取收到的数据长度,可通过数据包对象获取对方的IP和端口。
  • 代码测试与注意事项
    • 启动顺序:先启动服务端,再启动客户端。
    • 资源关闭:客户端发完数据后应关闭通信管道,服务端不应关闭。
  • UDP多发多收实现
    • 客户端改造:使用while死循环,让用户不断输入数据,封装成数据包发送,输入exit退出。
    • 服务端改造:使用while死循环,不断用数据包接收数据。
  • 服务端多客户端接收原理
    • 接收原理:服务端只负责接收流向本机和指定端口的数据包,不管数据来自哪个客户端,所以可以同时接收多个客户端的消息。
    • 多开客户端:在IDE中配置允许多开实例,可同时启动多个客户端。

三、TCP通信基础

  • 特点回顾 :TCP通信是面向连接的可靠通信,采用三次握手建立全双工可靠连接,能实现端到端通信,服务端确认接收后数据才被认为发送成功。
  • 实现方式 :在Java中使用Socket类实现TCP通信,基于IO流进行数据传输。
  • 通信模型 :通信分客户端和服务端,需建立Socket端到端的通信管道,通过字节输入流和输出流在管道中收发数据。
  • 客户端开发
    • 创建管道 :创建Socket对象请求与服务端连接,需填写服务器IP和端口,如使用本地IP可填127.0.0.1,端口可设为9999。
    • 发送消息 :从Socket管道获取字节输出流,可将其包装成打印流、缓冲字节输入流或特殊数据流(DataOutputStream)发送数据,注意流的对应匹配。
    • 资源释放 :实际开发中一般用户点退出时才关闭管道,一发一收场景可关闭。
  • 服务端开发
    • 创建对象 :使用ServerSocket类创建对象并注册端口,等待客户端连接,调用accept方法返回服务端的Socket对象。
    • 接收数据 :从Socket管道获取字节输入流,包装成特殊数据输入流(DataInputStream)接收客户端数据,先接收整数,再接收消息。
    • 获取信息 :可通过Socket管道获取客户端的IP和端口信息。

四、 测试与运行

  • 启动顺序 :先启动服务端,服务端在accept方法处阻塞等待客户端连接,客户端启动后双方建立通信管道。
  • 速度差异 :服务端和客户端执行速度快慢不影响数据接收,数据会缓存到管道中,确保对方收到。
  • 多发多收实现
    • 客户端改造 :使用死循环让用户反复输入消息,通过Scanner获取用户输入,发exit时关闭管道并退出循环。
    • 服务端改造 :将接收消息的逻辑放入死循环,只接收文本消息,服务端不能关闭管道。
  • 多客户端支持
    • 单线程问题 :当前服务端单线程只能处理一个客户端消息,加死循环也无法解决。
    • 多线程引入 :主线程负责接收客户端连接,每接到一个管道交给独立子线程处理消息,定义线程类(如ServerReader)重写run方法读取管道消息。
    • 上下线追踪 :服务端可通过接收管道知道客户端上线,客户端异常退出或关闭程序时服务端捕获异常追踪下线逻辑,可获取客户端IP。

五、BS架构原理

  • 架构特点 :CS架构需开发客户端和服务端,BS架构客户端为浏览器无需开发,服务端需开发响应网页。
  • 请求与响应 :浏览器使用HTTP协议通过IP和端口请求服务端,服务端响应网页数据需遵循HTTP协议规定的格式,包括协议版本、头部字段、空行等。
  • 代码开发 :复制之前的服务端代码进行修改,端口设为8080方便浏览器识别,使用打印流响应网页数据,响应完关闭管道。
  • 线程池优化
    • 优化原因 :每次请求开一个线程处理网站请求不合适,线程工作时间短,创建和销毁大量线程开销大,线程池适合处理网站请求。
    • 实现方法 :将Socket管道包装成任务对象(实现Runnable接口)交给线程池处理,创建线程池时设置核心线程数、最大线程数、任务队列等参数。

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

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

相关文章

Java行为型模式(状态模式)实现方式与测试方法

一、状态模式实现方式 核心结构 状态接口(State):定义状态相关的行为方法。具体状态类(ConcreteState):实现状态接口,封装特定状态下的逻辑。上下文类(Context)&#xff…

MISRA C-2012准则之标准C环境准则

目录 1.标准C环境准则 错误示例1:未定义行为(整数溢出) 错误示例2:未指定行为(函数调用顺序) 错误示例3:语言扩展(GCC内置函数) 错误示例4:关键未指定行…

26、鸿蒙Harmony Next开发:ArkTS并发(Promise和async/await和多线程并发TaskPool和Worker的使用)

目录 异步并发 (Promise和async/await) Promise async/await 多线程并发 多线程并发模型 内存共享模型 Actor模型 TaskPool TaskPool运作机制 TaskPool注意事项 Concurrent装饰器 装饰器说明 装饰器使用示例 TaskPool扩缩容机制 扩容机制 缩容机制 Worker Wo…

[IRF/Stack]华为/新华三交换机堆叠配置

堆叠的三大优势 提高资源利用率&#xff0c;获得更高的转发性能、链路带宽降低网络规划的复杂度、方便网络的管理降低故障对业务的影响时间 堆叠的两个需求 设备型号必须统一系统版本必须统一 华三堆叠案例&#xff1a;#### S6850_1 <H3C>sy [H3C]undo in en [H3C]sy SW…

融智兴科技: RFID超高频洗涤标签解析

在纺织品租赁与管理领域&#xff0c;布草、工服、医护织物等物品的流转追踪一直是运营管理的核心挑战。传统管理方式依赖人工计数与条码扫描&#xff0c;存在效率低下、差错率高、损耗严重等问题&#xff0c;尤其在工业洗涤环境下&#xff0c;纸质标签易损坏、识别率低。融智兴…

从平面到时空:地图故事的时空叙事与沉浸式阅读

朋友们&#xff0c;在工作中你是否也遇到过这些令人头疼的挑战&#xff1f;当项目汇报时总觉得表达不够精彩&#xff0c;方案讲解时听众总是一头雾水&#xff0c;制作应急预案时更是无从下手&#xff1f;别担心&#xff01;今天我要向大家介绍一个超级实用的解决方案——地图故…

自动控制原理知识地图:舵轮、路径与导航图

掌握自控原理的关键&#xff0c;在于看清那棵枝繁叶茂的“知识树”——从根部的数学模型&#xff0c;到主干的分析方法&#xff0c;直至顶端的系统设计。作为一名自动化专业学生&#xff0c;你是否曾在深夜里面对劳斯判据和奈奎斯特图感到深深的恐惧&#xff1f;作为初入行的工…

Flutter在Android studio运行出现Error: Entrypoint is not a Dart file

Flutter在Android studio运行出现Error: Entrypoint is not a Dart file

NE综合实验2:RIP 与 OSPF 动态路由精细配置及ACL访问控制列表 电脑

NE综合实验2&#xff1a;RIP 与 OSPF 动态路由精细配置及ACL访问控制列表 实验拓扑图实验需求 1.按照图示配置IP地址 2.按照图示区域划分配置对应的动态路由协议 3.在R7上配置dhcp服务器&#xff0c;能够让pc可以获取IP地址 4.将所有环回⼝宣告进ospf中&#xff0c;将环回⼝7宣…

Kafka 控制器(Controller)详解:架构、原理与实战

目录Kafka 控制器&#xff08;Controller&#xff09;详解&#xff1a;架构、原理与实战一、控制器的核心职责1. 元数据管理2. 分区状态机3. 故障恢复4. 集群操作协调二、传统 ZooKeeper 模式下的控制器1. 控制器选举机制2. 控制器与 ZooKeeper 的交互3. 潜在问题三、KRaft 模式…

【C++基础】#define vs constexpr:C++ 编译期常量的双雄对决(面试高频考点 + 真题解析)

​在 C++ 面试中,#define与constexpr的对比堪称 “元老级” 考点 —— 据统计,在 2023-2024 年的 C++ 工程师面试中,该知识点的出现频率高达 72%,尤其是在字节跳动、腾讯、华为等企业的校招 / 社招中,几乎是必问内容。​ 这两个语法元素都与 “编译期常量” 相关,但背后却…

k8s环境使用Operator部署Seaweedfs集群(上)

作者&#xff1a;闫乾苓 文章目录前言4.1 前置条件4.2 部署seaweedfs-operator4.3 准备operator镜像4.4 使用operator部署Seaweedfs集群4.4.1 部署StorageClass4.4.2 使用StorageClass预先创建PV前言 SeaweedFS Operator是一个Kubernetes Operator&#xff0c;用于自动化部署和…

Git CLI高危任意文件写入漏洞(CVE-2025-48384)PoC已公开

Git CLI&#xff08;命令行界面&#xff09;中存在一个高危漏洞&#xff0c;攻击者可利用该漏洞在Linux和macOS系统上实现任意文件写入。目前该漏洞的概念验证&#xff08;PoC&#xff09;利用代码已公开。该漏洞编号为CVE-2025-48384&#xff0c;CVSS严重性评分为8.1分&#x…

前端开发中关于表单内容的使用和基础知识

在前边&#xff0c;我们已经写过Web前端开发&#xff0c;Web前端开发&#xff0c;万字详细博文带你HTML&#xff0c;CSS快速入门&#xff08;上篇&#xff09;和Web前端开发&#xff0c;一文带你HTML&#xff0c;CSS快速入门&#xff08;下篇&#xff09;&#xff0c;使用近两万…

linux 安装mysql保姆教程

安装包下载地址: MySQL :: Download MySQL Community Server (Archived Versions) 解压到安装包&#xff1a; tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz 创建Mysql用户组和用户 groupadd mysql useradd -r -g mysql mysql 编译安装并初始化 进入/home/mysql/m…

Android系统的问题分析笔记 - Android上的调试方式 bugreport

在Android开发和系统调试中&#xff0c;bugreport&#xff08;错误报告&#xff09; 是一份包含设备详细系统状态、运行日志及应用行为的综合报告&#xff0c;是定位和诊断App崩溃、系统异常、性能问题等的核心工具。无论是开发者排查用户反馈的问题&#xff0c;还是设备厂商调…

GESP2025年6月认证C++四级( 第三部分编程题(2)排序)

参考程序&#xff1a;#include <cstdio> #include <algorithm> #include <vector> #include <iostream> using namespace std;int main() {int n, ans 0;// 读取学生人数scanf("%d", &n);// 用 vector 存储每个学生的身高和体重&#x…

SQL155 大小写混乱时的筛选统计

SQL155 大小写混乱时的筛选统计 题目理解 假设我们有一个考试系统数据库&#xff0c;里面有&#xff1a; exam_record表&#xff1a;记录学生考试作答情况examination_info表&#xff1a;记录考试信息&#xff0c;包括每个考试的类别标签(tag) ​问题描述​&#xff1a; 有…

无人机图像中的小目标检测新利器:深入解析 LAM-YOLO 模型

【导读】 随着无人机技术的发展&#xff0c;从交通监控到农业测绘&#xff0c;各类任务中对“空中视角下的小目标检测”需求激增。然而&#xff0c;由于无人机拍摄视角多变、目标尺寸微小、环境光照复杂等因素&#xff0c;传统检测模型常常出现“漏检”“误检”问题。 LAM-YO…

Rust 基础大纲

Rust 基础大纲1.Summary安装教材2 Rust 源1.Summary 安装 https://www.rust-lang.org/zh-CN/tools/install curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安装完成后&#xff0c;验证是否成功 rustc -V cargo -V# 创建项目 cargo new my_project # 编译项…