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

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.dtcms.com/a/284703.html

相关文章:

  • 关于CDH以及HUE的介绍
  • vue-seo优化
  • Android构建流程与Transform任务
  • 题解:P13311 [GCJ 2012 Qualification] Speaking in Tongues
  • java面向对象-多态
  • 【前端】Power BI自动化指南:从API接入到Web嵌入
  • 旅游管理实训基地建设:筑牢文旅人才培养的实践基石
  • LeetCode热题100—— 238. 除自身以外数组的乘积
  • Pygame创建窗口教程 - 从入门到实践 | Python游戏开发指南
  • 小白学Python,网络爬虫篇(1)——requests库
  • java Integer怎么获取长度
  • 【Jmeter】报错:An error occured:Unknown arg
  • 3.PCL点云合并
  • 为什么选择Selenium自动化测试?
  • 接口黑洞?破!安全堡垒?筑!冰火炼狱?战!MES7114W终极掌控
  • 学习C++、QT---27(QT中实现记事本项目实现行列显示、优化保存文件的功能的讲解)
  • 三、CV_VGGnet
  • 栈和队列的实现,咕咕咕
  • CTF之栅栏密码的传统型、W型与偏移量
  • ota之.加密算法,mcu加密方式
  • 开源 python 应用 开发(八)图片比对
  • Android wifi简单白名单实现逻辑
  • 20250717在荣品的PRO-RK3566开发板的Android13系统下解决点屏出现问题unsupport command data type: 217
  • 通俗的解释一下以太网中的端口号
  • 流式数据处理实战:用状态机 + scan 优雅过滤 AI 响应中的 `<think>` 标签
  • 深入理解CSS定位:绝对定位的包含块机制
  • 退休时间计算器,精准预测养老时间
  • 项目实战(18)-POE分离器
  • Spring底层原理(一)核心原理
  • RCU机制及常见锁的理解