oldboy 35th day . I love Python. 网络编程之 md5 验证 以及 socket模块其他方法 (四)

一, 昨日内容

  缓冲区: 


  subprocess 模块.

     Popen(cmd, shell=True, stdout= subprocess.PIPE, stderr= subprocess.PIPE) 此方法 可以执行系统命令

  struct 模块:

    pack('i', int) 讲21.3E以内的数据, 打包成4个长度的bytes. 和 unpack('i', r)被pack处理过的数据 还原.

  arp协议: 通过目标ip地址, 获取目标的mac地址.

  如何判断两台主机是否在同一个局域网内:

    判断网段是否相同.

    ip地址 & 子网掩码 = 网段

  端口: 操作系统给予随机分配, 通过端口号可以确定某一个应用程序.
    ip + 端口 唯一确定某一个主机上的某一个应用程序.

  TCP协议: 安全, 可靠, 面向连接, 面向数据流形式的传输.

  UDP协议: 快, 不安全, 不可靠, 不面向连接, 面向数据包 形式的传输.

  三次握手( 面试回答):

    1, 必须又客户端发起请求连接.
    2, 服务器接收到请求之后 回复给客户端 两个标识, 一个syn表示服务器 接受到请求, 一个 ack 表示服务器在做准备工作. 两个标识一起回复给客户端
    3, 客户端接受到服务器的回去, 客户端准备连接所有资源, 开始进行连接, 发送给服务器一个 ack表示客户端的连接准备工作 已经完成.

  四次挥手( 面试回答):

    1, 首先由连接双方, 任意一方发起断开连接的请求, 发送两个标识, 发起方 发送的请求 表示 自己没有数据要继续发送了, 可以断开连接了, 但是 你如果还有数据可以继续向我发送数据.
    2, 接收方 回复给发起方, 表示接到了 发起方 的断开请求, 并且开始着手准备断开事宜
    3, 接收方 准备完成后, 给发起方发送一个标识, 表示 接收方 没有数据继续发送了, 可以断开连接了.
    4, 发起方 接受到消息后, 准备断开连接, 回收资源.


今日内容:
  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类型的数据

具体详细内容,可见博客地址:http://www.cnblogs.com/Eva-J/articles/8244551.html

猜你喜欢

转载自www.cnblogs.com/Fushengliangnian/p/9341773.html