第三十三天 客户机和tcp多个客户端通信

1.为什么会出出现黏包问题:

答:1只有tcp协议下才会出现黏包问题

  2.tcp协议下传输数据存在缓存机制,可以避免数据的丢失

  3.再发送多个连续的小数据包时,根据算法优化原则会把它当成一个包进行发送

  4所有发生的一切归根到底都是因为我们再发送时不知道发送的数据大小

  5.tcp协议是面向流的协议

2.检验客户机合法问题的程序:(即我只想我规定的client进行使用)

  2.1再这之前我们先要讲述一个hmac模块:

from conf.config import *
import hmac
h=hmac.new(secret_key,b'hello') #左边时要加密的密文,右边是bytes类型的数据
secret=h.digest()  #进行数据的消化
hmac.compare._digest()#对密文和另一个密文进行比较
View Code

  2.2 os.urandom(n)随机产生n个字节的字符串,经常用随机数据的加密:

ret=os.urandom(4)#用于产生随机n个 字节的bytes类型数据
print(ret)
结果为
b'\x14\xbd~z'
View Code

  server是端程序:

import hmac
import os
import  socket
from conf.config import *
sk=socket.socket()
sk.bind(ip_port)
sk.listen()
def check_conn(conn):
    #创建一个判断client时候合法的函数
    msg=os.urandom(32)#随机生成一个32字节的bytes
    conn.send(msg)  #将随机生成的数发送到客户端
    h=hmac.new(secret_key,msg)  #进行加密处理
    ret2=h.digest()  #进行消化处理
    client_hamc=conn.recv(1024)  #收到客户端加密后的数据
    result=hmac.compare_digest(ret2,client_hamc) #进行两个数据的比较如果相同返回True
    print(result)  #反之返回false
    return result
conn,addr=sk.accept()
ret=check_conn(conn)
if ret:
    print('你的客户端合法:')
else:
    print('你属的客户端不合法:')
View Code
import socket
from conf.config import *
import hmac
sk=socket.socket()
sk.connect(ip_port)
ret=sk.recv(1024)
print(ret)
ret=hmac.new(secret_key,ret)#secret_key必须也要是bytes类型
client_hamc=ret.digest()
sk.send(client_hamc)
sk.close()
View Code

3.怎么实现再tcp协议下一个server端同时和多个client进行通讯的方法:

  server端程序:

from conf.config import *
import socketserver
class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            ret=self.request.recv(1024).decode('utf-8')
            if ret=='q': break
            print(ret)
            info=input('请输入内容:')
            self.request.send(info.encode('utf-8'))
if __name__=='__main__':
    server=socketserver.ThreadingTCPServer(ip_port,Myserver)
    server.serve_forever()
View Code

  client端程序:

from conf.config import *
import socket
sk=socket.socket()
sk.connect(ip_port)
while True:
    info=input('请输入内容:')
    if info=='q':
        sk.send(b'ok')
        break
    info=('二哥%s'%info).encode('utf-8')
    sk.send(info)
    ret=sk.recv(1024).decode('utf-8')
    if ret=='q':
        break
    print(ret)
sk.close()
View Code

  

猜你喜欢

转载自www.cnblogs.com/ab461087603/p/12447150.html