更新时间:2025-05-31 15:30点击:3
上周帮学弟调试毕设项目,他写的视频监控系统每秒只能传3帧。一看代码差点背过气——这兄弟居然用TCP协议传输实时视频!今天就带你搞懂以太网socket这个网络编程的命门,保准你的程序传输效率翻倍。
(敲黑板)先记住这个公式:socket = IP地址 + 端口号。它就像网络世界的电话插孔,没它程序根本没法\"打电话\"。但用错了协议类型,就像用对讲机开视频会议,效果能好才怪!
把socket拆开来看就两大功能:
举个栗子:微信视频通话时,系统会自动创建两个socket。一个用TCP传控制指令(比如挂断请求),另一个用UDP传实时画面。这就是为啥网络卡顿时画面模糊但还能说话的原因。
对比项 | TCP | UDP |
---|---|---|
连接方式 | 需要三次握手 | 直接开喷 |
数据可靠性 | 丢包自动重传 | 爱丢不丢 |
传输速度 | 慢但稳 | 快但可能丢帧 |
适用场景 | 文件传输、网页浏览 | 直播、游戏 |
头部开销 | 20字节 | 8字节 |
开发难度 | 要处理粘包 | 无需连接管理 |
重点来了:实时定位系统千万别用TCP!实测用TCP传GPS数据,延迟比UDP高300ms,车都撞了位置还没更新。
python复制import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP套接字
这里有个坑:AF_INET对应IPv4,AF_INET6才是IPv6。见过最离谱的bug,就是协议族选错导致局域网无法通信。
python复制s.bind((\'0.0.0.0\', 8888)) # 监听所有网卡的8888端口
记住:1024以下端口需要管理员权限!某次演示项目用了80端口,结果死活运行不起来,差点在甲方面前翻车。
python复制s.listen(5) # 最多允许5个排队请求 while True: client, addr = s.accept() # 阻塞等待客户端
重点提醒:listen的backlog参数不是连接数上限!Linux系统实际允许的排队连接数=backlog+1,设成5其实能处理6个。
python复制data = client.recv(1024) # 最多收1KB数据 client.send(b\'Received!\') # 发回确认信息
血泪教训:recv不一定收满指定字节!某次收10MB文件时,以为循环收1024次就行,结果少了最后512字节,文件哈希对不上。
python复制s.setblocking(False) # 设置非阻塞模式
代价是要自己处理BlockingIOError
,但并发量能提升10倍。适合即时通讯类应用。
python复制import select readable, _, _ = select.select([s], [], [], 1) # 1秒超时
用select监控多个socket,单线程处理上千连接不是梦。但超过1024个fd会崩,这时候得上epoll。
python复制with open(\'video.mp4\', \'rb\') as f: os.sendfile(client.fileno(), f.fileno(), 0, os.path.getsize(\'video.mp4\'))
直接在内核层传输文件,省去两次内存拷贝。实测传1GB文件,耗时从8秒降到3秒。
开发了十年网络应用,总结三条铁律:
最后说句得罪人的:那些教人用socket写聊天程序的教程,跟教用汇编写网站没区别。现在都2023年了,直接用WebSocket或gRPC框架不香吗?记住,会用轮子比会造轮子更值钱!