zoukankan      html  css  js  c++  java
  • 第三十三天 客户机和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'x14xbd~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

      

  • 相关阅读:
    linux下安装elasticsearch5.6.3
    linux下安装git
    环境安装备忘录 Zookeeper
    环境安装备忘录 JDK
    环境安装备忘录 Tomcat
    MySql 通过show status 优化数据库性能
    MySQL执行计划解读 转他人文章
    2015年12月21日 my.cnf 配置
    mysql 如何查看my.cnf的 位置
    mysql状态查看 QPS/TPS/缓存命中率查看
  • 原文地址:https://www.cnblogs.com/ab461087603/p/12447150.html
Copyright © 2011-2022 走看看