网络编程之socketserver以及socket更多方法
关于socketserver
关于socket的更多方法
服务端套接字函数:
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始tcp监听
s.accept () 被动接受tcp客户的连接,(阻塞式)等待连接的到来
客户端套接字函数:
s.connect() 主动初始化tcp服务器连接
s.connect()_ex() 是拓展版本,出错时返回出错码,而。不是抛出异常。
公共用途的套接字函数
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.setbl1ocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间
面向文件的套接字的函数:
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件
1.2 验证客户端链接的合法性
注释:主要防止黑客截取信息然后植入病毒,采用加盐hmac方式实现简单的客户端链接认证功能。
import socket import os import hmac def auth(conn): msg=os.urandom(32) conn.send(msg) result=hmac.new(key,msg) client_digest=conn.recv(1024) if result.hexdigest()==client_digest.decode('utf-8') print('是合法的连接') else: print(‘不合法的连接’) return False secret_key=b'alex_ab' sk=socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() conn,addr=sk.accept() if auth(conn): print(conn.recv(1024)) conn.close() else: conn.close() sk.close()
import hamc 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' sk=socket.socket() sk.connect(('127.0.0.1',9000)) auth(sk) sk.send(b'upload') sk.close()
1.3 关于socketserver的并发编程
import socketserver class Myserver(socketserver.BaseTequestHandler): def handle(self): conn=self.request while True: conn.send(b'hello') print(conn.recv(1024)) server=socketserver.ThreadingTCPSserver(('127.0.0.1',9000),Myserver) server.serve_forever()
import socket sk = socket.socket() sk.connect(('127.0.0.1',9000)) while True: ret = sk.recv(1024) print(ret) sk.send(b'byebye') sk.close()