首先,Socket 通信可以这样理解:Socket不是一种具体协议,而是应用程序使用 TCP/IP、UDP/IP进行网络通信的“编程接口”。
也就是说,TCP、UDP 是通信协议;Socket 是程序调用这些协议的入口。
一、Socket到底是什么?
Socket 中文常翻译为:套接字。
这个名字比较抽象,可以先用一个类比:
现实通信 | 网络通信 |
电话号码 | IP地址 |
分机号 | 端口号 |
电话机 | Socket |
通话规则 | TCP/UDP协议 |
比如:192.168.1.10:502
含义是:
IP地址:192.168.1.10端口号:502
这个组合就能定位到网络中的某个设备上的某个通信服务。
二、Socket 和 OSI 七层模型的关系
Socket 主要工作在:
应用层程序 ↓Socket接口 ↓TCP / UDP ↓ IP ↓以太网 对应 OSI 模型大概是:
<b>层级 | 内容 |
应用层 | 你的程序、PLC通信程序、上位机软件 |
传输层 | TCP / UDP |
网络层 | IP |
数据链路层 | Ethernet、MAC |
物理层 | 网线、光纤、电信号 |
所以 Socket 本身不是 OSI 的某一层协议,而是应用程序访问传输层协议的一套接口。
三、Socket通信的核心三要素
一个 Socket 通信,最核心的是:IP地址 + 端口号 + 协议类型
例如:192.168.1.20 : 502 : TCP
含义是:和 192.168.1.20 这台设备的 502 端口,通过 TCP 协议通信
再比如:192.168.1.30 : 10000 : UDP
含义是:和 192.168.1.30 的 10000 端口,通过 UDP 协议通信
四、TCP Socket 和UDP Socket 的区别
Socket 常见有两类:
TCP Socket
UDP Socket
1. TCP Socket
TCP 是面向连接的通信。
它的特点是:
先建立连接
再发送数据
最后断开连接
类似打电话:拨号 → 对方接听 → 双方通话 → 挂断
TCP Socket 特点
特点 | 说明 |
可靠 | 数据会确认、重传 |
有连接 | 通信前要建立连接 |
有顺序 | 数据按顺序到达 |
稳定 | 适合重要数据 |
开销较大 | 比 UDP 慢一些 |
TCP Socket 适合场景
场景 | 举例 |
上位机和PLC通信 | Modbus TCP |
文件传输 | FTP |
数据库通信 | MySQL、SQL Server |
MES系统通信 | 工位数据上传 |
设备状态采集 | 设备报警、产量、节拍 |
在自动化设备中,很多上位机通信、本地设备通信、机器人控制通信,都大量使用 TCP Socket。
2. UDP Socket
UDP 是无连接通信。
它的特点是:不建立连接,直接发数据
类似寄快递或喊话:我把数据发出去,不一定确认你收没收到
UDP Socket 特点
特点 | 说明 |
快 | 延迟低 |
无连接 | 不需要握手 |
不保证可靠 | 可能丢包 |
不保证顺序 | 先发的不一定先到 |
开销小 | 适合实时性要求高的场景 |
UDP Socket 适合场景
场景 | 举例 |
实时广播 | 设备发现 |
视频流 | 工业相机视频流 |
状态广播 | 多设备状态同步 |
低延迟控制 | 某些实时数据传输 |
局域网设备搜索 | 扫描在线设备 |
工业现场中,很多设备发现、广播、实时数据采集,会用 UDP。
五、Socket通信的基本流程
1. TCP服务端流程
服务端一般是“等别人来连”。
典型流程:
创建Socket ↓绑定IP和端口 ↓监听端口 ↓等待客户端连接 ↓接收数据 ↓发送响应 ↓关闭连接 对应程序逻辑:
socket()
bind()
listen()
accept()
recv()
send()
close()
<b>2. TCP客户端流程
客户端一般是“主动连接别人”。
典型流程:
创建Socket ↓连接服务器IP和端口 ↓发送数据 ↓接收响应 ↓关闭连接 对应程序逻辑:
socket()
connect()
send()
recv()
close()
<b>六、举一个工业现场例子:上位机读取PLC数据
假设:
PLC IP:192.168.1.10
PLC端口:502
协议:Modbus TCP
上位机IP:192.168.1.100
通信过程是:
上位机创建Socket ↓上位机连接 PLC 的 502 端口 ↓TCP三次握手成功 ↓上位机发送Modbus读寄存器命令 ↓PLC返回寄存器数据 ↓上位机解析数据 这里要注意:
Socket只负责把数据发出去和收回来
Modbus协议负责规定数据内容怎么组织
也就是说:
Socket = 运输通道
Modbus = 货物格式
<b>七、Socket 和Modbus TCP 的关系
很多人容易混淆:
Socket 通信 ≠ Modbus TCP
Modbus TCP 是跑在 TCP Socket 上的一种应用层协议
可以这样理解:
Ethernet:底层网络
IP:找到哪台设备
TCP:建立可靠连接
Socket:程序调用TCP的接口
Modbus TCP:规定数据格式
Modbus TCP 报文大概是:[MBAP头] + [功能码] + [地址] + [数据]
例如读保持寄存器:功能码 03
写单个寄存器:功能码 06
写多个寄存器:功能码 16
Socket 本身不关心这些功能码,它只负责发送一串字节。
八、Socket通信的本质:发送和接收字节流
Socket 通信最底层的本质是:
发送字节
接收字节
比如你发送:
01 03 00 00 00 02
对方收到以后,要根据协议解释:
01:站号
03:功能码
00 00:起始地址
00 02:读取数量
如果双方没有约定协议,Socket 收到的就只是一堆字节,没有意义。
所以工程里一定要区分:
通信通道是否正常
数据协议是否正确
这两个是不同问题。
九、Socket常见通信模式
1. 一问一答模式
最常见。
客户端:发请求
服务端:回响应
例如:
上位机读取PLC寄存器
PLC返回数据
适合:
Modbus TCP
扫码枪通信
仪表通信
MES查询
2. 长连接模式
连接建立后一直保持。
连接一次
长期收发
不断开
适合:
PLC和上位机持续通信
机器人状态实时采集
设备数据持续上传
优点:
响应快
不用反复建立连接
缺点:
要处理断线重连
要处理心跳检测
3. 短连接模式
每次通信都重新连接。
连接
发送
接收
断开
适合:
偶尔通信
低频数据上传
简单设备查询
优点:
逻辑简单
资源占用少
缺点:频繁建立连接,效率低
4. 心跳模式
长连接中非常重要。
每隔一段时间发一次心跳包
目的是判断:
对方还在不在线?
网络有没有断?
连接是不是假连接?
例如:
每 1 秒发送一次状态查询
连续 3 次无响应,认为通信断开
十、Socket通信中的客户端和服务端
Socket 通信里经常有两个角色:
Server:服务端
Client:客户端
服务端
特点:
固定IP
固定端口
等待别人连接
例如:
PLC作为Modbus TCP Server
上位机作为Modbus TCP Client
客户端
特点:
主动连接服务端
主动发送请求
例如:
上位机主动连接PLC
MES主动连接设备
机器人主动连接上位机
十一、工业自动化中 Socket 的典型应用
1. PLC 与上位机通信
常见形式:
PLC作为Server
上位机作为Client
应用:
读取设备状态
写入工艺参数
采集报警信息
上传产量数据
2. PLC 与扫码枪通信
扫码枪扫到二维码后,通过 TCP Socket 或串口发送数据:
二维码内容 → Socket发送 → PLC/上位机接收
应用:
产品追溯
载具识别
工单绑定
防错检测
3. 视觉系统与PLC通信
视觉软件识别完成后,发送结果:
OK/NG
坐标X/Y/角度
二维码内容
缺陷类型
通信方式可能是:
TCP Socket
UDP Socket
Modbus TCP
EtherNet/IP
Profinet
4. 机器人与上位机通信
例如机器人需要接收上位机下发的目标点:
X=120.5
Y=80.2
Z=30.0
R=45.0
Socket 用来传输这些数据。
5. 设备与MES通信
设备把数据上传到MES:
设备编号
产品SN
测试结果
时间戳
报警代码
生产节拍
MES返回:
是否允许生产
工艺参数
产品型号
工单信息
十二、Socket通信常见问题
1. Ping通,但Socket连不上
这很常见。
说明:网络层是通的,但传输层可能有问题
可能原因:
端口没开
服务端程序没启动
防火墙拦截
IP对了但端口错了
服务端只允许指定客户端连接
对应 OSI:
Ping:主要看L3网络层
Socket连接:看L4传输层和应用服务
2. Socket能连上,但没有数据
可能原因:
协议格式不对
对方等你先发
双方都在等对方发
报文结束符不对
编码格式不对
数据长度不对
例如扫码枪常见问题:
扫码枪发送字符串后需要加 \r\n
但接收端没有按 \r\n 解析
3. 数据粘包
TCP 是字节流协议,不是消息包协议。
这句话非常重要。
比如你发送两次:
发送1:ABC
发送2:DEF
接收方可能一次收到:ABCDEF
也可能分两次收到:
AB
CDEF
所以 TCP Socket 通信必须设计数据边界。
常见解决方法:
方法 | 示例 |
固定长度 | 每条消息固定64字节 |
分隔符 | 每条消息以 \r\n 结束 |
长度头 | 前4个字节表示后面数据长度 |
标准协议 | Modbus TCP、HTTP |
4. 连接突然断开
可能原因:
网线松动
交换机异常
对方程序崩溃
设备重启
网络超时
防火墙断开空闲连接
工程上必须做:
断线检测
自动重连
心跳机制
异常日志
十三、Socket调试常用工具
工业现场常用:
工具 | 用途 |
Ping | 测IP是否通 |
Telnet | 测端口是否通 |
NetAssist | TCP/UDP调试 |
SocketTool | Socket测试 |
Wireshark | 抓包分析 |
Modbus Poll | Modbus TCP测试 |
Modbus Slave | 模拟Modbus设备 |
现场排查顺序建议:
先Ping
再测端口
再用Socket工具连
再抓包
最后分析协议内容
十四、最小C# Socket通信示例
1. TCP服务端示例
using System;using System.Net;using System.Net.Sockets;using System.Text;class TcpServerDemo{static void Main() { TcpListener server = new TcpListener(IPAddress.Any, 9000); server.Start(); Console.WriteLine("TCP Server started on port 9000..."); TcpClient client = server.AcceptTcpClient(); Console.WriteLine("Client connected."); NetworkStream stream = client.GetStream(); byte[] buffer = new byte[1024]; int length = stream.Read(buffer, 0, buffer.Length); string received = Encoding.ASCII.GetString(buffer, 0, length); Console.WriteLine("Received: " + received); byte[] response = Encoding.ASCII.GetBytes("OK\r\n"); stream.Write(response, 0, response.Length); client.Close(); server.Stop(); }} <b>2. TCP客户端示例
using System;using System.Net.Sockets;using System.Text;class TcpClientDemo{static void Main() { TcpClient client = new TcpClient(); client.Connect("192.168.1.10", 9000); NetworkStream stream = client.GetStream(); byte[] data = Encoding.ASCII.GetBytes("HELLO\r\n"); stream.Write(data, 0, data.Length); byte[] buffer = new byte[1024]; int length = stream.Read(buffer, 0, buffer.Length); string response = Encoding.ASCII.GetString(buffer, 0, length); Console.WriteLine("Response: " + response); client.Close(); }} 这个例子里:
服务端返回OK
<b>十五、工程上设计Socket通信,必须考虑这些问题
1. 报文格式
必须明确:
一条消息从哪里开始?
到哪里结束?
包含哪些字段?
字段长度是多少?
用什么编码?
比如:<stx>SN=ABC123;RESULT=OK;<etx>
或者:长度头 + 命令字 + 数据区 + 校验
2. 超时时间
必须设计:
连接超时
发送超时
接收超时
响应超时
例如:
连接超时:3秒
读取超时:1秒
心跳周期:1秒
连续3次失败判定断线
3. 异常处理
必须处理:
连接失败
对方断开
接收为空
数据格式错误
超时无响应
端口被占用
4. 日志记录
工业设备里,Socket日志非常重要。
建议记录:
连接时间
断开时间
发送内容
接收内容
异常信息
重连次数
通信耗时
否则现场出了问题,很难追溯。
十六、Socket通信和工业总线的区别
对比项 | Socket通信 | EtherCAT / Profinet / CANopen |
本质 | 通用网络编程接口 | 工业通信协议/现场总线 |
实时性 | 一般 | 更强 |
开放性 | 高 | 依赖协议栈/设备 |
使用难度 | 灵活但要自己定义协议 | 标准化更强 |
典型场景 | 上位机、扫码枪、MES、视觉 | 伺服、IO、运动控制 |
数据结构 | 自己定义或基于协议 | 通常由协议规定 |
一句话:Socket适合做设备之间的普通数据交互;实时运动控制更适合 EtherCAT、Profinet IRT、CANopen 等工业总线。
十七、最终总结
Socket通信可以归纳为一句话:Socket 是程序进行网络通信的接口,它通过 IP 地址找到设备,通过端口号找到应用服务,通过 TCP/UDP 完成数据传输。
在自动化设备里,Socket非常常见,尤其用于:
PLC 上位机
PLC 视觉软件
PLC 扫码枪
设备 MES
机器人 PC控制软件
设备 设备
但是做工程时一定要记住:
Socket只解决“数据怎么传”
协议解决“数据是什么意思”
程序逻辑解决“收到后怎么处理”
这三件事不要混在一起。
---
往期热门文章:
</etx></stx></b></b></b></b></b></b>