socket套接字通信和粘包问题
什么是socket?
socket是一个模块,又称套接字,用来封装互联网协议(应用层以下的层)。
为什么要有socket?
socket可以实现 互联网协议 应用层以下的层的工作
-提高开发效率
怎么使用socket?
import socket
写socket套接字:
Client
server.py #服务端 import socket #获取手机 server = socket.socket() #绑定ip地址,port端口 server.bind(('127.0.0.1',8500)) #半连接池 server.listen(5)#最多5个人坐椅子,实际上==6 print('server is running') while True: #conn为通道 ,等待电话的接入 conn,addr = server.accept() print(addr) while True: try: #接听对方假话的内容 #data客户端发送过来的消息 date = conn.recv(1024) print(date.decode('utf-8')) if len(date) == 0: break if date.decode('utf-8') == 'q': break send_date = input("服务端>>:") #服务端往客户端发送消息 conn.send(send_date.encode('utf-8')) except Exception as e: print(e) break
client.py #客户端 import socket #买手机 client = socket.socket() #拨号 connect为连接 client.connect(('127.0.0.1',8500))#客户端的ip与port必须与服务端一致 print('client is running') while True: send_date = input("客户端>>:") #必须发送bytes类型的数据 client.send(send_date.encode('utf-8')) #接受date的数据 date = client.recv(1024) if date.decode('utf-8') == 'q': break if len(date) == 0: break print(date.decode('utf-8')) client.close()
粘包
1)问题:无法确认对方发送过来数据的大小。
2)问题:在发送数据间隔短并且数据量小的情况下,
会将所有数据一次性发送
确认:确认对方数据的大小
解决粘包问题(struct模块
-无论哪一端先发送数据
-客户端
1)先制作报头,并发送(struct)
2)发送真实数据
-服务端:
1)接受报头,并解包获取 真实数据长度
2)根据真实数据长度 接受真实数据
recv(真实数据长度)