第二十九天
tcp 协议
在连接内多喝客户端说几句
能够接收多个客户端的请求
服务端
import socket
sk=socket.socket()
sk.bing('127.0.0.1',9001) #申请操作系统资源
sk.listen()
conn,addr=sk.accept()
conn.send(b'hello')
msg=conn.recv(1024)
print(msg)
conn.close() #挥手 断开连接 虽然断开连接了 但是没有归还资源
sk.close() #归还操作系统的资源
发送中文
str-> encode(utf-8)->bytes
'你' 字符
utf-8 b'' 181921'' b'' 181921''----decode('utf-8') --你
str-> encode('gbk)->bytes
服务端
while 1:
conn,addr=sk.accept()
# conn.send(b'hello')
conn.send('您好'.encode('utf-8'))
msg=conn.recv(1024)
print(msg)
conn.close()
sk.close()
客户端
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',9001))
msg=sk.recv(1024)
msg1=msg.decode('utf-8')
print(msg,msg1)
sk.send(b'bye')
sk.close()
用什么编的 就用什么解码
udp协议的编程
控制台颜色
https://www.cnblogs.com/Eva-J/p/8330517.html
#格式:
设置颜色开始 :\033[显示方式;前景色;背景色m
#说明:
前景色 背景色 颜色
---------------------------------------
30 40 黑色
31 41 红色
32 42 绿色
33 43 黃色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色
显示方式 意义
-------------------------
0 终端默认设置
1 高亮显示
4 使用下划线
5 闪烁
7 反白显示
8 不可见
#例子:
\033[1;31;40m <!--1-高亮显示 31-前景色红色 40-背景色黑色-->
\033[0m <!--采用终端默认设置,即取消颜色设置-->
print('\033[0;32;40m欢迎使用学生选课系统\033[0m')
try:
num = int(input('请输入数字选择功能 :'))
except Exception as e:
print('\033[31m对不起!您输入的内容有误~\033[0m')
颜色使用例子
import time
num=1
cou=0
ll='王小屋臭狗屎我爱你'
while 1:
b=[i for i in range(41,48)]
time.sleep(0.3)
a=f'\033[{b[num]}m{ll[cou]}'*20
cou+=1
if cou==len(ll):
cou=0
num+=1
if num==7:
num=0
print(a)
import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9001))
a=0
while 1:
msg,addr=sk.recvfrom(1024)
l=[i for i in range(30,38)]
b=str(0)+str(l[a])
print(msg.decode('utf-8'))
# # 发送指令
# a= input('输入要发送的内容:')
# sk.sendto(a.encode('utf-8'),addr)
客户端
import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
server=('127.0.0.1',9001)
while 1:
msg=input('输入你要发送的内容')
# bytes(a,encode='utf-8')
if msg.upper()=='Q':break
sk.sendto(msg.encode('utf-8'),server)
# msg=sk.recv(1024).decode('utf-8')
# if msg.upper() == 'Q': break
print(msg)
粘包现象
两条消息黏在一起了
只出现在 tcp协议中,因为tcp协议 多条消息之间没有界限 并且还有一大堆算法优化算法
发送端:两条消息间隔时间太短了 黏在一起发送
接收端:接受消息不及时
解决粘包现象的本质: 设置一个边界
#先发送长度,在发送文件
#粘包发送
import struct
import socket
sk=socket.socket()
sk.bind(('127.0.0.1',9001))
sk.listen()
conn,addr=sk.accept()
msg1=input('>>>').encode('utf-8')
msg2=input('>>>').encode('utf-8')
# num = str(len(msg1))
blen=struct.pack('i',len(msg1))
conn.send(blen)
conn.send(msg1)
conn.send(msg2)
conn.close()
sk.close()
#粘包接受 端
import struct
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',9001))
# num=int(sk.recv(4).decode('utf-8'))
length=sk.recv(4)
length=struct.unpack('i',length)[0] #返回的是一个元组 第0个位置
msg1=sk.recv(length)
msg2=sk.recv(1024)
print(msg1.decode('utf-8'))
print(msg2.decode('utf-8'))
sk.close()
struct模块
import struct
num1=23132
num2=123
num3=8
ret1=struct.pack('i',num1) #打包成4字节
print(len(ret1)) #4
ret2=struct.pack('i',num2)
print(len(ret2)) #4
ret3=struct.pack('i',num3)
print(len(ret3)) #4
# 范围 -2147483647~2147483648 ----------2G 的数据
print(struct.unpack('i', ret1)) #还原成原数
print(struct.unpack('i', ret2))
print(struct.unpack('i', ret3))
原理
发送端
计算要发送的数据长度
通过struct模块将长度转换成 固定的4字节
发送4字节的长度
你吃饭了吗
skajd
接收端
收4字节
在使用struct.unpack() 转换成 数字
这个数字就是即将要接受的数据的长度
再根据数据长度 接收数据
两条数据就不会粘到一起了
对代码有疑问欢迎交流
一个python爱好者 :
微信:at8685b

浙公网安备 33010602011771号