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()

  

原文地址:https://www.cnblogs.com/123zzy/p/9512247.html