《Python》网络编程之验证客户端链接的合法性、socketserver模块

一、socket的更多方法介绍

# 服务端套接字函数
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()     # 创建一个与该套接字相关的文件

官方文档对socket模块下的socket.send()和socket.sendall()解释如下:

socket.send(string[, flags])
Send data to the socket. The socket must be connected to a remote socket. The optional flags argument has the same meaning as for recv() above. Returns the number of bytes sent. Applications are responsible for checking that all data has been sent; if only some of the data was transmitted, the application needs to attempt delivery of the remaining data.

send()的返回值是发送的字节数量,这个数量值可能小于要发送的string的字节数,也就是说可能无法发送string中所有的数据。如果有错误则会抛出异常。

–

socket.sendall(string[, flags])
Send data to the socket. The socket must be connected to a remote socket. The optional flags argument has the same meaning as for recv() above. Unlike send(), this method continues to send data from string until either all data has been sent or an error occurs. None is returned on success. On error, an exception is raised, and there is no way to determine how much data, if any, was successfully sent.

尝试发送string的所有数据,成功则返回None,失败则抛出异常。

故,下面两段代码是等价的:

#sock.sendall(‘Hello world\n‘)

#buffer = ‘Hello world\n‘
#while buffer:
#    bytes = sock.send(buffer)
#    buffer = buffer[bytes:]

send和sendall方法

二、验证客户端链接的合法性

  如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用hmac+加盐的方式来实现

  server端:

import os
import hmac
import socket

def auth(conn):
    msg = os.urandom(32)    # 生成一个随机的字符串
    print(msg, len(msg))    # 32位
    conn.send(msg)  # 发送到client端
    result = hmac.new(secret_key, msg)  # 处理这个随机字符串,得到一个结果
    client_digest = conn.recv(1024)     # 接收client端处理的结果
    if result.hexdigest() == client_digest.decode(‘utf-8‘):
        print(‘是合法的连接‘)     # 对比成功可以继续通讯
        return True
    else:
        print(‘不合法的连接‘)     # 不成功 close
        return False

secret_key = b‘alex_s‘   # 相当于‘盐‘
sk = socket.socket()
sk.bind((‘127.0.0.1‘, 9000))
sk.listen()
conn, addr = sk.accept()
if auth(conn):
    print(conn.recv(1024))
    # 正常的和client端进行沟通
    conn.close()
else:
    conn.close()

sk.close()

  client端:

import hmac
import socket

def auth(sk):
    msg = sk.recv(32)   # 接收随机字符串
    result = hmac.new(key, msg) # 处理这个随机字符串
    res = result.hexdigest()
    sk.send(res.encode(‘utf-8‘))

key = b‘alex_s‘ # ‘盐‘,要与server端的一致
sk = socket.socket()
sk.connect((‘127.0.0.1‘, 9000))
auth(sk)    # 调用函数进行验证
# 验证成功就可以通讯了
sk.send(b‘hello‘)

sk.close()

三、socketserver模块

  server端:

import socketserver
# tcp协议的server端就不需要导入socket
class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
        conn = self.request
        while 1:
            conn.send(b‘hello‘)
            print(conn.recv(1024))

# 创建一个server, 将服务地址绑定到127.0.0.1  9000
server = socketserver.ThreadingTCPServer((‘127.0.0.1‘, 9000), Myserver)
# 让server永远运行下去,除非强制停止程序
server.serve_forever()

  client端:

import socket

sk = socket.socket()
sk.connect((‘127.0.0.1‘, 9000))
while 1:
    ret = sk.recv(1024)
    print(ret)
    sk.send(b‘byebye‘)
sk.close()

原文地址:https://www.cnblogs.com/yzh2857/p/9663604.html

时间: 2024-08-01 11:39:13

《Python》网络编程之验证客户端链接的合法性、socketserver模块的相关文章

Python全栈开发--socketserver模块和验证客户端链接的合法性

验证客户端链接的合法性 分布式系统中实现一个简单的客户端链接认证功能 #_*_coding:utf-8_*_ from socket import * import hmac,os secret_key=b'linhaifeng bang bang bang' def conn_auth(conn): ''' 认证客户端链接 :param conn: :return: ''' print('开始验证新链接的合法性') msg=os.urandom(32) conn.sendall(msg) h=

python3 验证客户端链接的合法性

服务端: 1.secret_key为bytes类型 2.random_bytes = os.urandom(n) 随机生成一个长度为n的random_bytes server.send(random_bytes)发送给客户端 3.hmac_bytes = hmac(secret_key, random_bytes, 'md5').digest() 通过hmac模块对secret_key和random_bytes进行md5加密,生成一个md5加密后的hmac_bytes client_hmac_b

26.python网络编程

一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好. 但是如果这两个程序之间想要传递一个数据,你要怎么做呢? 这个问题以你现在的知识就可以解决了,我们可以创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容就可以了. 但是当你的a.py和b.py分别在不同电脑上的时候,你要怎么办呢? 类似的机制有计算机网盘,qq等等.我们可以在我们的电脑上和别人聊天,可以在自

Python网络编程04/recv原理/高大上版解决粘包方式

目录 Python网络编程04/recv原理/高大上版解决粘包方式 1.昨日内容回顾 2.recv工作原理 3.高大上版解决粘包方式(自定制报头) 3.1 解决思路: 3.2 服务端 3.3客户端 4.基于UDP协议的socket通信 4.1服务端 4.2客户端 Python网络编程04/recv原理/高大上版解决粘包方式 1.昨日内容回顾 1. 通信循环 2. 链接通信循环 3. 远程执行命令: subprocess.Popen() # bytes: 网络传输, 文件存储时. 4. 粘包现象

Python网络编程1--笔记

网络编程 一.客户端与服务器架构 硬件的客户端与服务器架构:打印机服务器,文件服务器 硬件服务器有关门的设备,打印机服务器有打印机,文件服务器NFS有磁盘. 软件的客户端与服务器架构:web服务器,数据库服务器,窗口服务器 软件服务器主要提供程序的运行,数据的发送与接收,合并,升级或其他的程序或数据的操作. 在完成服务之前,服务器必须要先完成一些设置.先要创建一个通讯端点,然服务器能"监听"请求.一单通讯端点创建好之后,我们在"监听"的服务器就可以进入他那等待和处理

python 网络编程:socket

在学习socket之前,我们先复习下相关的网络知识. OSI七层模型:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层.OSI七层模型是由国际标准化组织ISO定义的网络的基本结构,不仅包括一些概念和结构,还包括一系列的协议. TCP/IP四层模型:既然有OSI七层模型,为什么我们还要定义一个TCP/IP的四层模型呢,那是因为OSI七层模型对应面过于宽泛,很多概念实现不了,也没必要实现,因此,实际生产中广泛应用的是TCP/IP四层结构,他们的对应关系如下表: TCP/IP OSI 应用层

Python网络编程05----django与数据库的交互

介绍 Django为多种数据库后台提供了统一的调用API,在Django的帮助下,我们不用直接编写SQL语句.Django将关系型的表(table)转换成为一个类(class).而每个记录(record)是该类下的一个对象(object).我们可以使用基于对象的方法,来操纵关系型数据库. 设置数据库 设置数据库需要修改settings.py文件 如果使用的数据库是mysql: [python] view plaincopy DATABASES = { 'default': { 'ENGINE' 

Python网络编程02----基于UDP的Python简易服务器

UDP 服务器不是面向连接的,所以不用像 TCP 服务器那样做那么多设置工作.事实上,并不用设置什么东西,直接等待进来的连接就好了. ss = socket() # 创建一个服务器套接字 ss.bind() # 绑定服务器套接字 inf_loop: # 服务器无限循环 cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送) ss.close() # 关闭服务器套接字 服务器端: from socket import * from time import ctime

Python网络编程03/ low版解决粘包问题

目录 Python网络编程03/ low版解决粘包问题 1.操作系统的缓存区 2.基于TCP协议的socket循环通信 2.1 服务端(server) 2.2客户端(client) 3.基于TCP协议的socket链接+循环 通信 3.1服务端(server) 3.2 客户端(client) 4.基于TCP协议的socket应用实例:执行远程命令 4.1服务端(server) 4.2客户端(client) 5.粘包现象 5.1服务端(server) 5.2客户端(client) 5.3展示收发问