第二十九天

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() 转换成 数字

这个数字就是即将要接受的数据的长度

再根据数据长度 接收数据

两条数据就不会粘到一起了

posted @ 2020-03-22 23:27  小丁变优秀  阅读(150)  评论(0)    收藏  举报