tcp协议的知识点
scoket() tcp协议的server bind 绑定一个ip和窗口 listen 监听,代表socket服务的开启 accept 等,到有客户来访问和客户端建立连接 send 只通过连接发送消息,不需要访问地址 recv 只接受消息 connect 客户端/toc协议的方法,和server端建立连接 close 关闭服务/连接
1.简单的tcp协议的演示
sever端
import socket sk = socket.socket() sk.bind(('10.61.0.52', 9001)) # 申请操作系统的资源 sk.listen() # conn, addr = sk.accept() # conn里储存的是一个客户端和server端的连接信息 conn.send(b'hellow') msg = conn.recv(1024) print(msg) conn.close() # 挥手 断开连接 sk.close() # 归还申请操作系统的资源
client端
import socket
sk = socket.socket() #
sk.connect(('10.61.0.52', 9001))
msg = sk.recv(1024) #
print(msg) #
sk.send(b'baibai') #
sk.close()
2.实现多个客户间的通信,(可以通信中文,可以输入想说的内容,可以自动的断开通信)
sever端
import socket
sk = socket.socket()
sk.bind(('10.61.0.207', 9002)) # 申请操作系统的资源
sk.listen()
while True: # 同时连接上多个用户的功能
conn, addr = sk.accept()
print('conn:',conn) # 获得地址
while True: # 可以进行多次对话的功能
word = input('输入内容\n>>>')
conn.send(word.encode('utf-8'))
msg = conn.recv(1024).decode('utf-8')
if msg.upper() == '退出': break
print(msg)
conn.close()
sk.close()
client端
import socket
sk = socket.socket() #
sk.connect(('10.61.0.207', 9002))
while True: # 添加多次会话功能
msg = sk.recv(1024)
msg2 = msg.decode('utf-8') # 我们在这里改变了编码方式
if msg2.upper() == '退出': break
print(msg2) #
word = input('请输入内容\n>>>')
sk.send(word.encode('utf-8'))# 在在里我改变了发送回
# 去的编码方式
sk.close()
tcp协议的粘包现象
什么是粘包?
两条或更多分开发送的信息连接在一起的就是粘包现象
发生在发送端的粘包:发送间隔短,数据小,由于优化机制就合并在一起发送了
发送在接收端的粘包:tco协议的传输是流式传输,数据与数据之间没有边界
粘包发送的本质:tco协议的传输是流失传输,数据与数据之间没有边界
解决粘包现象的方法:自定义协议 struct模块
发送端 接收端
先发送4字节的数据长度 先接收4字节,知道数据的长度
先按照长度发送数据 在按照长度接收数据
sever端
# 在使用tcp协议时如何避免粘包现象
# 只要控制第一个字节的长度后就可以避免粘包现象了
# 使用struck模块将字节转换成4个字节的
import struct # 使用了struck模块
sk = socket.socket()
sk.bind(('10.61.0.87',9001))
sk.listen()
conn,addr = sk.accept()
msg1 = input('输入内容>>>') .encode()
msg2 = input('输入内容>>>').encode()
blen = struct.pack('i',len(msg1)) # 控制第一个字节的长度,长度为4
conn.send(blen)
conn.send(msg1)
conn.send(msg2)
conn.close()
sk.close()
client端
# 粘包现象的解决
# 使用struct模块
import socket
import struct
sk = socket.socket()
sk.connect(('10.61.0.87',9001))
len_msg1 = sk.recv(4)
len_msg1 = struct.unpack('i',len_msg1)[0]
msg1 = sk.recv(len_msg1)
msg2 = sk.recv(1024)
print(msg1.decode('utf-8'))
print(msg2.decode('utf-8'))
sk.close()