python:验证客户端链接的合法性与socketserver
2024-09-04 07:48:46
一、验证客户端链接的合法性
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=hmac.new(secret_key,msg) digest=h.digest() respone=conn.recv(len(digest)) return hmac.compare_digest(respone,digest) def data_handler(conn,bufsize=1024): if not conn_auth(conn): print('该链接不合法,关闭') conn.close() return print('链接合法,开始通信') while True: data=conn.recv(bufsize) if not data:break conn.sendall(data.upper()) def server_handler(ip_port,bufsize,backlog=5): ''' 只处理链接 :param ip_port: :return: ''' tcp_socket_server=socket(AF_INET,SOCK_STREAM) tcp_socket_server.bind(ip_port) tcp_socket_server.listen(backlog) while True: conn,addr=tcp_socket_server.accept() print('新连接[%s:%s]' %(addr[0],addr[1])) data_handler(conn,bufsize) if __name__ == '__main__': ip_port=('127.0.0.1',9999) bufsize=1024 server_handler(ip_port,bufsize)
服务端
__author__ = 'Linhaifeng' from socket import * import hmac,os secret_key=b'linhaifeng bang bang bang' def conn_auth(conn): ''' 验证客户端到服务器的链接 :param conn: :return: ''' msg=conn.recv(32) h=hmac.new(secret_key,msg) digest=h.digest() conn.sendall(digest) def client_handler(ip_port,bufsize=1024): tcp_socket_client=socket(AF_INET,SOCK_STREAM) tcp_socket_client.connect(ip_port) conn_auth(tcp_socket_client) while True: data=input('>>: ').strip() if not data:continue if data == 'quit':break tcp_socket_client.sendall(data.encode('utf-8')) respone=tcp_socket_client.recv(bufsize) print(respone.decode('utf-8')) tcp_socket_client.close() if __name__ == '__main__': ip_port=('127.0.0.1',9999) bufsize=1024 client_handler(ip_port,bufsize)
客户端
二、socketserver
import socketserver class Myserver(socketserver.BaseRequestHandler): def handle(self): self.data = self.request.recv(1024).strip() print("{} wrote:".format(self.client_address[0])) print(self.data) self.request.sendall(self.data.upper()) if __name__ == "__main__": HOST, PORT = "127.0.0.1", 9999 # 设置allow_reuse_address允许服务器重用地址 socketserver.TCPServer.allow_reuse_address = True # 创建一个server, 将服务地址绑定到127.0.0.1:9999 server = socketserver.TCPServer((HOST, PORT),Myserver) # 让server永远运行下去,除非强制停止程序 server.serve_forever()
server端
import socket HOST, PORT = "127.0.0.1", 9999 data = "hello" # 创建一个socket链接,SOCK_STREAM代表使用TCP协议 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.connect((HOST, PORT)) # 链接到客户端 sock.sendall(bytes(data + "\n", "utf-8")) # 向服务端发送数据 received = str(sock.recv(1024), "utf-8")# 从服务端接收数据 print("Sent: {}".format(data)) print("Received: {}".format(received))
client
最新文章
- 如何让你的网站支持https
- 视觉机器学习------K-means算法
- jQuery学习笔记(四):attr()与prop()的区别
- php网络编程
- sql 基本操作
- 【转载】FPGA静态时序分析——IO口时序
- if in hlsl
- jQuery之$(document).ready()使用介绍
- substring函数——sql
- 解决Windows 程序界面闪烁问题的一些经验
- SQLite/嵌入式数据库
- js原型对象
- Kali Linux 渗透测试手册(1.1)安装虚拟机
- storm ui 网页一直出现提示loading summary
- response.redirect 与location.href 的区别
- 浅谈String中的==和对象中引用对象类型的==
- FFmpeg编解码处理2-编解码API详解
- 如何在linux下检测内存泄漏(转)
- Ubuntu下如何访问Windows磁盘?
- git 本地安装
热门文章
- docker 解决容器时间与主机时间不一致的问题
- oracle 查看一个表中的记录是否被锁住
- ibaits数组形式批量入库
- Gradle发布项目到 maven 之gradle-bintray-plugin(2)
- apply、call、bind区别、用法
- (转)Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
- (转)超全整理!Linux性能分析工具汇总合集
- 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤
- Unity5.x发布IOS项目Xcode8免签证调试发布教程
- 解决npm install安装慢的问题