ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python基础 -- tcp、udp模式

2022-07-20 09:02:58  阅读:210  来源: 互联网

标签:发送 udp socket python print tcp sk -- msg


# 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(长度),来取值,可能会造成数据的错误。

解决方法:指定自己的传送协议

每次发送信息,发送两次,第一次发一个指定长度的字节,表示即将发送的数据的长度,第二次才发送消息。  接受端接受两次,第一次recv指定长度的字节,解码获取消息的长度,第二次recv获取指定长度的消息,确保信息没有遗漏。

 

标签:发送,udp,socket,python,print,tcp,sk,--,msg
来源: https://www.cnblogs.com/lhg37927/p/16496554.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有