zoukankan      html  css  js  c++  java
  • socket 模块中一些常用方法:

    1, socket 模块中其他常用方法:
        重点方法:
          setblocking(False) 设置 阻塞状态为 非阻塞.  ( 这代表这一路畅通 老溜了)
          s.settimeout(int) :设置阻塞套接字操作的超时时间

          s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1):  设置指定套接字的参数  ( 此方法可以解决当一个服务器没有被彻底关闭 再次重复使用某端口的时候 报错的问题)

        服务端套接字函数
          
    s.bind() 绑定(主机,端口号)到套接字
          s.listen() 开始TCP监听
          s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

        客户端套接字函数
          s.connect() 主动初始化TCP服务器连接
          s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

        公共用途的套接字函数
          s.recv() 接收TCP数据
          s.send() 发送TCP数据
          s.sendall() 发送TCP数据
          s.recvfrom() 接收UDP数据
          s.sendto() 发送UDP数据
          s.getpeername() 连接到当前套接字的远端的地址
          s.getsockname() 当前套接字的地址
          s.getsockopt() 返回指定套接字的参数
          s.setsockopt() 设置指定套接字的参数
          s.close() 关闭套接字

        面向锁的套接字方法
          s.setblocking() 设置套接字的阻塞与非阻塞模式
          s.settimeout() 设置阻塞套接字操作的超时时间
          s.gettimeout() 得到阻塞套接字操作的超时时间

        面向文件的套接字的函数
          s.fileno() 套接字的文件描述符
          s.makefile() 创建一个与该套接字相关的文件

     2, 关于客户端验证 新的内置模块 --> hmac

        一个简单版的 md5 加盐加密的模块:

    #  hmac md5的 用法.
    
    
    
    import hmac
    
    key = '天王盖地虎'    #  盐
    ch = '随机字符串'        # 字符串
    obj = hmac.new(key.encode('utf-8'),ch.encode('utf-8'))   # 加盐 加密
    re = obj.digest()            # 得到加密后的内容
    
    hmac md5的用法
    

      服务器:

    import socket
    import hashlib
    sk = socket.socket()
    sk.bind(('127.0.0.1',9090))
    sk.listen()
    conn,addr = sk.accept()
    key = '天王盖地虎'# 这个是固定盐
    ch = '这是一个随机字符串'
    conn.send(ch.encode('utf-8'))# 把随机字符串发给client
    md5_obj = hashlib.md5(key.encode('utf-8'))
    md5_obj.update(ch.encode('utf-8'))
    re = md5_obj.hexdigest()
    # 固定的用盐的加密方式
    client_re = conn.recv(1024).decode('utf-8')# 接收client端加密后的结果
    
    if re == client_re:
        print('你好机油!')
        '''收发数据的逻辑'''
    else:
        print('你根本不是老司机')
        conn.close()
    sk.close()
    
    server
    

      客户端:

    import socket
    import hmac
    sk = socket.socket()
    sk.connect(('127.0.0.1',9090))
    
    key = '天王盖地虎'
    ch = sk.recv(1024)
    obj = hmac.new(key.encode('utf-8'),ch)
    re = obj.digest()
    sk.send(re)
    
    sk.close()
    
    client
    

      

     3, socketserver 模块 解决 tcp协议 服务器同时连接多个客户端的问题.

          此模块 只可以重写 tcp协议中的 服务器的代码,  相关的客户端代码 还是正常的内容.

          此模块, 内部大概 是导入 socket 模块, 然后在里面实现了 并发 然后讲代码 封装好后的代码. 六六六哦

    import socketserver
    # 类里面的 函数里面 写的接收- 发送的逻辑
    # 其中 sk  conn 等效于 self.requset.
    class Myserver(socketserver.BaseRequestHandler):
        def handle(self):
            # print(123)
            self.request.send()       # 发送信息
            print(self.request.recv(1024).decode('utf-8'))    # 接受信息
    
    # 绑定端口 和 绑定功能
    server = socketserver.TCPServer(('192.168.19.200',9090),Myserver)
    
    # 表示永久存在.
    server.serve_forever()
    
    socketserver
    

     4, os.unrandom(int) 随机生成 int个 bytes类型的数据

     5,socket模块开启一个永久性服务

       服务器代码

    import socketserver
     
     
    class MySocket(socketserver.BaseRequestHandler):
        def handle(self):# 这个方法的名字是固定的,必须是这个名字
            # 收发的逻辑代码
            # self.request == conn
            msg = self.request.recv(1024).decode('utf-8')
            print(msg)
            self.request.send(msg.upper().encode('utf-8'))
     
     
     
    server = socketserver.TCPServer(('127.0.0.1',8080),MySocket)# 固定的
    server.serve_forever()# 开启一个永久性的服务
     
     
    客户端代码
    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1',8080))
     
    msg_s = input('>>>')
    sk.send(msg_s.encode('utf-8'))
     
    print(sk.recv(1024).decode('utf-8'))
     
    sk.close()
    

      

  • 相关阅读:
    删除git上已经提交的文件
    spark安装
    Ganglia+nagios 监控hadoop资源与报警
    自定义标签库开发与el表达式
    JavaBean与MVC
    Jsp-查漏补缺
    HttpSession
    Cookie
    HttpServleRequest
    Servlet学习-查漏补缺
  • 原文地址:https://www.cnblogs.com/123zzy/p/9512247.html
Copyright © 2011-2022 走看看