![]()
osi七层协议的传输层:TCP/UDP协议
1、TCP协议:语音通话(发送文件、下载上传)
必须线接通电话,同一时刻只能和一个人聊天,传输稳定,慢
可以发送任意长度的信息
UDP协议:发微信(即使通信、在线播放)
不需要接通,只要互相知道ip 端口就可以通信,同时可以和多个人聊天,快
但是传输相对不稳定,不能传输过长的消息
2、TCP协议socket
# server服务端
import socket
while True:
sk = socket.socket()
sk.bind(('192.168.13.16', 9000)) # 把地址绑定到socket
sk.listen(3) # 监听链接
while True: # 循环不断开发送信息
conn, addr = sk.accept() # 接受客户端链接
ret = conn.recv(1024).decode() # 解码接收客户端信息
print(ret) # 打印客户端信息
ret1 = input('>>>')
conn.send(ret1.encode()) # 编码并向客户端发送信息
if ret == 'q':
print('通话关闭')
break
conn.close() # 关闭客户端socket
sk.close() # 关闭服务器socket(可选)
# client 客户端
import socket
while True: # 循环不断开发送
sk = socket.socket() # 创建客户socket
sk.connect(('192.168.13.16', 9000)) # 尝试连接服务器
ret1 = input('>>>')
sk.send(ret1.encode()) # 编码
ret = sk.recv(1024) # 对话(发送/接收)
ret = ret.decode() # 解码
print(ret)
if ret == 'q':
print('通话关闭')
break
sk.close() # 关闭客户socket
3、粘包现象:TCP是有来回的,为了提高效率而把极短时间内的东西(缓存区)放在一起发送,就会造成粘包效应,
本质是接收端不知道发送端给我发送了多长的数据
tcp协议本身的特点导致的:流式传输/无边界、合包机制、缓存机制、拆包机制
# 解决方法 自定义协议:先发送要传递数据的字节长度再发,接收先接4个字节知道长度
import struct
ret = struct.pack('i', 560000) # 'i'固定范围,大小必须是多少内
print(ret, len(ret)) # b'\x80\x8b\x08\x00' 4
res = struct.unpack('i', ret)
print(res[0]) # 560000