python基础 -- tcp、udp模式
# tcp 协议服务端 import socket sk = socket.socket() #创建socket对象 sk.bind(('127.0.0.1', 8889)) #绑定socket的ip和端口 sk.listen(5) #设置socket对象的监听数量 conn, info = sk.accept() #socket开始监听连接,一直到有请求连接,这里完成三次握手,病返回连接对象,以及请求信息 conn.send(b"hello,wrold") #网络传输的数据格式是byte 类型,发送数据的格式要转化为byte类型 msg = sk.recv() #接受数据也是同样的byte类型,需要解码 print(msg.decode("utf-8")) conn.close() #表示当前连接终止,这里开始四次挥手 sk.close() #这里socket对象关闭,表示socket服务终止
#tcp客户端 import socket sk = socket.socket() sk.connect(("127.0.0.1", 8889)) sk.send(b"hualala") msg= sk.recv(1024) #这里代表一次性接收多少个数量的字节 print(msg.decode("utf-8")) sk.close()
# upd协议服务端 import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1', 8889)) msg, info = sk.recvfrom(1024) print(msg) ret = sk.sendto(b'hahah', info) print(ret)
# udp服务客户端 import socket sk = socket.socket(type=socket.SOCK_DGRAM) msg= sk.sendto(b'holy, shit', ('127.0.0.1', 8889)) print(msg) msg2 = sk.recvfrom(1024) print(msg2)
2.tcp的粘包问题
问题现象:发送端将两次发送的消息一次发出,导致信息出错。
问题原因: tcp协议的机制导致。有两种情况,一种情况是发送端的合包机制,如果发送的数据量不大,并且发送时间特别接近的话,发送端会将两条信息一并发送,并接受一次返回确认。另一种情况就是,接收端的缓存机制,如果接受端没有及时接受信息,接收端会将发送来的信息缓存在内存中,按照接收端recv(长度),来取值,可能会造成数据的错误。
2.1粘包问题解决思路
解决方法:指定自己的传送协议
每次发送信息,发送两次,第一次发一个指定长度的字节,表示即将发送的数据的长度,第二次才发送消息。 接受端接受两次,第一次recv指定长度的字节,解码获取消息的长度,第二次recv获取指定长度的消息,确保信息没有遗漏。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix