Socket编程:客户端与服务器通信全解析(网络编程)
客⼾端和服务端服务端在常⻅的⽹络数据传输场景下把提供服务的⼀⽅进程称为服务端可以提供对外服务。客⼾端获取服务的⼀⽅进程称为客⼾端。Socket套接字概念Socket套接字是由系统提供⽤于⽹络通信的技术是基于TCP/IP协议的⽹络通信的基本操作单元。基于Socket套接字的⽹络程序开发就是⽹络编程。socket 是操作系统中特殊的文件,表示网卡硬件设备socket api 传输层,提供给应用层TCP : 有链接, 可靠传输, 面向字节流, 全双工UDP : 无链接, 不可靠传输, 面向数据报, 全双工链接:抽象的,虚拟的链接.通信双方,各自保存对方的关键信息(IP和端口)TCP有链接,先保存对方的关键信息,然后发送数据UDP无链接,不需要保存对方的关键信息,直接发送数据不可靠传输:数据发送出去之后,关系对方是否收到,如果可靠传输:发送出去之后,不管了全双工:同时进行双向通信半双工:同一时刻,只能单向通信(兽医)UDP数据报套接字编程DatagramSocketDatagram:数据报创建一个这样的对象,就相当于在系统内核里创建了一个socket文件. 创建socket文件,也会占用文件描述符表的一个位置,用完之后要记得及时关闭,否则可能会出现文件资源泄露DatagramSocket 构造方法DatagramSocket()创建⼀个UDP数据报套接字的Socket绑定到本机任意⼀个随机端⼝⼀般⽤于客⼾端DatagramSocket(int port)创建⼀个UDP数据报套接字的Socket绑定到本机指定的端⼝⼀般⽤于服务端谁主动,谁就是客户端. 谁被动,谁就是服务器.DatagramSocket 方法void receive(DatagramPacket p)从此套接字接收数据报如果没有接收到数据报该⽅法会阻塞等待void send(DatagramPacket p)从此套接字发送数据报包不会阻塞等待直接发送void close()关闭此数据报套接字DatagramPacketDatagramPacket 构造方法DatagramPacket(byte[] buf, int length)构造⼀个DatagramPacket以⽤来接收数据报,接收的数据保存在字节数组第⼀个参数buf中接收指定 ⻓度第⼆个参数lengthDatagramPacket(byte[] buf, int offset, int length, SocketAddress address)构造⼀个DatagramPacket以⽤来发送数据报,发送的数据为字节数组第⼀个参数buf中从0到指定⻓度第⼆个参数length。address指定⽬的主机的IP和端⼝号DatagramPacket ⽅法InetAddress getAddress()从接收的数据报中获取发送端主机IP地址或从发送的数据报中获取接收端主机IP地址int getPort()从接收的数据报中获取发送端主机的端⼝号或从发送的数据报中获取接收端主机端⼝号byte[] getData()获取数据报中的数据InetSocketAddress:创建⼀个Socket地址包含IP地址和端⼝号代码示例import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UdpEchoServer { //先创建 socket对象 private DatagramSocket socket null; public UdpEchoServer(int port) throws SocketException { socket new DatagramSocket(port); } public void start() throws IOException { //启动服务器 System.out.println(服务器启动....); //服务器,需要不断处理客户发送过来的请求 while(true){ //循环一次就是处理一个请求 //1.读取请求并解析 DatagramPacket requestPacket new DatagramPacket(new byte[1024],1024); socket.receive(requestPacket); //为了处理方便 String request new String(requestPacket.getData(),0,requestPacket.getLength()); //2.根据请求构造响应 String response process(request); //3.把响应返回给客户端 DatagramPacket responsePacket new DatagramPacket(response.getBytes(),response.getBytes().length, requestPacket.getSocketAddress()); socket.send(responsePacket); System.out.printf([%s:%d]; resp: %s\n,requestPacket.getAddress().toString(),responsePacket.getPort(),request,response); } } private String process(String request) { return request; } public static void main(String[] args) throws IOException { //端口号是一个整数,随意指定 UdpEchoServer udpEchoServer new UdpEchoServer(9090); udpEchoServer.start(); } }import java.io.IOException; import java.net.*; import java.util.Scanner; public class UdpEchoCient { private DatagramSocket socket null; private String serverIP; private int serverPort; public UdpEchoCient(String serverIp,int serverPort) throws SocketException { socket new DatagramSocket(); this.serverIP serverIp; this.serverPort serverPort; } public void start() throws IOException { System.out.println(客户端启动); Scanner sc new Scanner(System.in); while (true) { //1.从控制台读取用户输入 System.out.println(- ); String request sc.next(); //2.构造请求,发送给服务器 DatagramPacket requestPacket new DatagramPacket(request.getBytes(), request.getBytes().length, InetAddress.getByName(serverIP), this.serverPort); socket.send(requestPacket); //3.读取服务器响应 DatagramPacket responsePacket new DatagramPacket(new byte[1024], 1024); socket.receive(responsePacket); String response new String(requestPacket.getData(), 0, requestPacket.getLength()); System.out.println(response); } } public static void main(String[] args) throws IOException { UdpEchoCient cient new UdpEchoCient(127.0.0.1,9090); cient.start(); } }服务器必须要指定固定的端口,确保客户端随时能找到服务器.客户端来说,必须不指定固定端口,让系统随机分配空闲的端口,避免端口号冲突(大饼)

相关新闻

普通人要Codex有什么用?

普通人要Codex有什么用?

我觉得很多人第一次看到 Codex,都会有一个很自然的反应:“这不是程序员用的吗?我又不会写代码,要它干什么?”以前这么理解其实没太大问题。但现在我反而觉得,Codex 对普通人最有意思的地方,已经…

2026/10/16 3:24:16 阅读更多 →
辽宁乡村展示与综合管理平台的设计与实现------SpringBoot + Vue + MySQL:把“看乡村、游乡村、住乡村、买农品”放进一个平台

辽宁乡村展示与综合管理平台的设计与实现------SpringBoot + Vue + MySQL:把“看乡村、游乡村、住乡村、买农品”放进一个平台

这个项目做的不是一个单纯后台它把乡村内容展示、农产品电商、旅游攻略、景点预约、特色民宿、乡村美食和后台运营放在同一套 Web 系统中。用户端负责“发现与消费”,管理员端负责“内容与资源运营”。如果只从功能菜单看,这个系统像一个模块很多的管理平…

2026/10/16 11:02:19 阅读更多 →
品牌TikTok矩阵如何避免内容同质化?AI批量创作与KOC运营策略

品牌TikTok矩阵如何避免内容同质化?AI批量创作与KOC运营策略

对于每个月需要生产数百条、甚至数千条TikTok素材的出海品牌来说,AI已经不是“要不要用”的问题,而是:怎样使用AI提高内容产能,同时不把品牌内容做成流水线复制品? 现在AI可以辅助完成选题、脚本、Hook、字幕、翻译、…

2026/10/15 18:29:30 阅读更多 →

最新新闻

跨平台SSL证书导入脚本:Windows与Linux批量部署指南

跨平台SSL证书导入脚本:Windows与Linux批量部署指南

简介:这份资源提供在Windows与Linux系统中导入SSL证书的自动化脚本,面向需要为Web服务配置HTTPS通信的运维人员与系统管理员。压缩包内共2个文件,分别为Linux平台使用的sh脚本与Windows平台使用的bat脚本,包体仅578B,轻…

2026/10/17 16:31:36 阅读更多 →
viewer.min.js图片查看器集成指南:从初始化到避坑实践

viewer.min.js图片查看器集成指南:从初始化到避坑实践

简介:viewer.min.js 是一款轻量级 JavaScript 图像查看器库,面向需要在前端实现图片缩放、旋转、平移等交互效果的前端开发者。资源包以 viewerjs-main 命名,共包含 177 个文件,整体打包 3.14MB,其中以 121 个 js 文件…

2026/10/17 16:31:36 阅读更多 →
信呼OA系统开源部署指南:中小团队低成本的协同办公方案

信呼OA系统开源部署指南:中小团队低成本的协同办公方案

简介:信呼协同办公OA系统v1.8.6提供了一套开源的企业办公自动化解决方案,适合中小型企业和研发团队使用,能够将流程审批、任务协作、日程管理、移动办公等常见需求整合到一个平台中。这个版本在之前基础上优化了系统稳定性和操作体验&#xf…

2026/10/17 16:31:36 阅读更多 →
Flutter蓝牙开发实战:协议设计、插件选型与跨平台适配

Flutter蓝牙开发实战:协议设计、插件选型与跨平台适配

1. 蓝牙协议在 Flutter 项目中的整体设计思路1.1 为什么要在移动端项目里引入蓝牙能力做移动端项目时间长了,总会碰到一类需求:设备不在云端,也不走 Wi-Fi,而是靠蓝牙近距离通信。比如智能手环同步步数、体脂秤回传数据、便携打印…

2026/10/17 16:31:36 阅读更多 →
油猴脚本从入门到实战:安装配置与高效使用指南

油猴脚本从入门到实战:安装配置与高效使用指南

1. 先搞懂油猴插件到底是什么说到油猴插件,很多人的第一反应是:听说过,但一直没搞懂。以为它是什么灰色地带的黑科技,或者觉得那是程序员才折腾的东西。今天把话说透,油猴插件/脚本就是一个运行在浏览器里的轻量小助手…

2026/10/17 16:31:36 阅读更多 →
TortoiseGit绿色对勾消失?从图标覆盖到注册表抢位的完整排查指南

TortoiseGit绿色对勾消失?从图标覆盖到注册表抢位的完整排查指南

那天我像往常一样打开资源管理器,突然发现整个工作目录的文件夹都变成了最普通的黄色小文件夹——TortoiseGit 的绿色对勾不见了。第一反应是仓库坏了,赶紧打开终端跑了个 git status ,结果文件状态一切正常,也没有任何报错。那…

2026/10/17 16:30:36 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →