博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络编程中客户端链接的合法性,socketserver模块
阅读量:5364 次
发布时间:2019-06-15

本文共 4411 字,大约阅读时间需要 14 分钟。

客户端链接的合法性

 

验证合法性:   首先,我们来探讨一下,什么叫验证合法性, 举个例子:有一天,我开了一个socket服务端,只想让咱们这个班的同学使用,但是有一天, 隔壁班的同学过来问了一下我开的这个服务端的ip和端口,然后他是不是就可以去连接我了啊,那怎么办,我是不是不想让他连接我啊,我需要验证一下你的身份, 这就是验证连接的合法性,再举个例子,就像我们上面说的你的windows系统是不是连接微软的时间服务器来获取时间的啊,你的mac能到人家微软去获取时间吗,你愿意, 人家微软还不愿意呢,对吧,那这时候,你每次连接我来获取时间的时候,我是不是就要验证你的身份啊,也就是你要带着你的系统信息,我要判断你是不是我微软的windows, 对吧,如果是mac,我是不是不让你连啊,这就是连接合法性。如果验证你的连接是合法的,那么如果我还要对你的身份进行验证的需求,也就是要验证用户名和密码,那么我们还需要进 行身份认证。连接认证>>身份认证>>ok你可以玩了。
客户端链接认证功能实现: 验证合法性连接的服务端:
1 secret_key=b'Jedan has a big key!' 2 def conn_auth(conn): 3     ''' 4     认证客户端链接 5     :param conn: 6     :return: 7     ''' 8     print('开始验证新链接的合法性') 9     msg=os.urandom(32)#生成一个32字节的随机字符串10     conn.sendall(msg)11     h=hmac.new(secret_key,msg)12     digest=h.digest()13     respone=conn.recv(len(digest))14     return hmac.compare_digest(respone,digest)15 16 def data_handler(conn,bufsize=1024):17     if not conn_auth(conn):18         print('该链接不合法,关闭')19         conn.close()20         return21     print('链接合法,开始通信')22     while True:23         data=conn.recv(bufsize)24         if not data:break25         conn.sendall(data.upper())26 27 def server_handler(ip_port,bufsize,backlog=5):28     '''29     只处理链接30     :param ip_port:31     :return:32     '''33     tcp_socket_server=socket(AF_INET,SOCK_STREAM)34     tcp_socket_server.bind(ip_port)35     tcp_socket_server.listen(backlog)36     while True:37         conn,addr=tcp_socket_server.accept()38         print('新连接[%s:%s]' %(addr[0],addr[1]))39         data_handler(conn,bufsize)40 41 if __name__ == '__main__':42     ip_port=('127.0.0.1',9999)43     bufsize=102444     server_handler(ip_port,bufsize)
验证合法性的连接的客户端:
1 from socket import * 2 import hmac,os 3  4 secret_key=b'Jedan has a big key!' 5 def conn_auth(conn): 6     ''' 7     验证客户端到服务器的链接 8     :param conn: 9     :return:10     '''11     msg=conn.recv(32)12     h=hmac.new(secret_key,msg)13     digest=h.digest()14     conn.sendall(digest)15 16 def client_handler(ip_port,bufsize=1024):17     tcp_socket_client=socket(AF_INET,SOCK_STREAM)18     tcp_socket_client.connect(ip_port)19 20     conn_auth(tcp_socket_client)21 22     while True:23         data=input('>>: ').strip()24         if not data:continue25         if data == 'quit':break26 27         tcp_socket_client.sendall(data.encode('utf-8'))28         respone=tcp_socket_client.recv(bufsize)29         print(respone.decode('utf-8'))30     tcp_socket_client.close()31 32 if __name__ == '__main__':33     ip_port=('127.0.0.1',9999)34     bufsize=102435     client_handler(ip_port,bufsize)

 

介绍代码中使用的两个方法:       1、os.urandom(n)         其中os.urandom(n) 是一种bytes类型的随机生成n个字节字符串的方法,而且每次生成的值都不相同。再加上md5等加密的处理,就能够成内容不同长度相同的字符串了。
使用方法:
1 import os2 from hashlib import md53 4 for i in range(10):5     print (md5(os.urandom(24)).hexdigest())

 

2、hmac: 我们完全可以用hashlib来实现,但是学个新的吗,没什么不好的,这个操作更方便一些。     Python自带的hmac模块实现了标准的Hmac算法,我们首先需要准备待计算的原始消息message,随机key,哈希算法,这里采用MD5.       使用hmac的代码如下:
1 import hmac2 3 message = b'Hello world'4 key = b'secret'5 h = hmac.new(key, message, digestmod='MD5')6 print(h.hexdigest())
比较两个密文是否相同,可以用hmac.compare_digest(密文、密文),然会True或者False。
socketserver模块实现并发
服务端:
1 #引入模块 2 import socketserver 3 #自己写一个类,类名自己随便定义,然后继承socketserver这个模块里面的 4 class Myserver(socketserver.BaseRequestHandler): 5     # 写一个handle方法,必须叫这个名字 6     def handle(self): 7         while 1:  #循环进行读取回复 8             from_client_msg = self.request.recv(1024)  # self.request = conn 接收消息 9             print(from_client_msg.decode('utf-8'))    #打印客户端消息10             msg = input('服务端说:')11             self.request.send(msg.encode('utf-8'))   #发消息12 #thread 线程,现在只需要简单理解线程,别着急,后面很快就会讲到啦,看下面的图13 if __name__ == '__main__':14     #使用socketserver的ThreadingTCPServer这个类,将IP和端口的元祖传进去,还需要将上面咱们自己定义的类传进去,得到一个对象,相当于我们通过它进行了bind、listen15     ip_port = ('127.0.0.1',8001)16     server = socketserver.ThreadingTCPServer(ip_port,Myserver)17     #使用我们上面这个类的对象来执行serve_forever(),方法,他的作用就是说,我的服务一直开启着,就像京东一样,不能关闭网站,对吧,并且serve_forever(),帮我们进行了accept18     server.serve_forever()
客户端:
1 # 导入socket 2 import socket 3  4 # 创建client客户端对象 5 client = socket.socket() 6 # 通过connect连接服务器 7 client.connect(('127.0.0.1', 8001)) 8 # 循环连接 9 while 1:10     msg = input('客户端说>>>')11     # 消息发送至服务端12     client.send(msg.encode('utf-8'))13     # 接受服务端消息14     from_server_msg = client.recv(1024)15     # 打印服务端回复消息16     print(from_server_msg.decode('utf-8'))

 

转载于:https://www.cnblogs.com/Godisgirl/p/10234105.html

你可能感兴趣的文章
Python编写购物车程序优化-升级完整版
查看>>
转载 ASP.NET常用的正则表达式
查看>>
xshell sftp可用命令,sftp: cannot open d: to write![解决]
查看>>
约瑟夫环
查看>>
sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法...
查看>>
一代才女林徽因 人生若只如初见
查看>>
Examining the Rooms - 第一类斯特灵数
查看>>
给物体边缘加高光轮廓的办法
查看>>
利用指针初始化一个三维数组,只使用一层循环
查看>>
zbb20170927 如果使用jquery,应使用prop方法来获取和设置checked属性,不应使用attr
查看>>
20135202闫佳歆--week7 可执行程序的装载--学习笔记
查看>>
Duilib的学习笔记
查看>>
json 四大类库
查看>>
BZOJ1067 [SCOI2007]降雨量 线段树
查看>>
01背包
查看>>
使用js Math.random()函数生成n到m间的随机数字
查看>>
锁,信号量,条件变量-unix课程的个人体会
查看>>
深入介绍Word开发
查看>>
jvm垃圾回收算法
查看>>
分页总页数计算公式
查看>>