一、为了防止客户端被人非法利用,需要在使用之前对客户端进行合法性验证。接下来就是客户端验证的几种方法

hmac  加密方法

import socket
import os
import hmac #能转化成密文模块
secret_key=b'apple' #密钥,必须是bytes类型
sk=socket.socket()
sk.bind(('127.0.0.1',8008))
sk.listen()
def check_con(con): #定义一个验证函数
msg=os.urandom(32) #系统模块中的urandom方法,可以生成指定位数的bytes数
con.send(msg)
h=hmac.new(secret_key,msg) #new方法:接收两盒变量:密钥和要加密的变量
digest=h.digest() #密文变量等于
client_digest=con.recv(1024) #接收到的密文
return hmac.compare_digest(digest,client_digest)#hmac模块compare_digest方法:比较两个密文是否一致。
con,addr=sk.accept()
res=check_con(con)
if res: #比较
print('合法的客户端')
con.close()
else:
print('不合法的客户端')
con.close()
sk.close()
#客户端
import socket
import hmac
secret_key=b'apple' #密钥:和服务端密钥要一致
sk=socket.socket()
sk.connect(('127.0.0.1',8008))
msg=sk.recv(1024)
h=hmac.new(secret_key,msg) #将接收到的信息进行加密
digest=h.digest() #得到密文变量
sk.send(digest) #将密文变量发送到服务端进行比较
sk.close()

  客户端验证的总的思路是将服务端随机产生的指定位数的字节发送到客户端,两边同时用hmac进行加密,然后对生成的密文进行比较,相同就是合法的客户端,不相同就是不合法的端户端

二、socketserver模块:在socket模块的基础上加一层socket层,目的是让服务端可以处理多个线程,(能启动多个线程)。

服务端:

import socketserver
class MyServer(socketserver.BaseRequestHandler): #必须要继承(socketserver.BaseRequestHandler类
def handle(self): # self.request 就相当于一个conn #必须要有def handle(self)方法
while True:
print(self.client_address)
msg = self.request.recv(1024).decode('utf-8') #相当于conn.recv
if msg == 'q':break
print(msg)
info = input('%s>>>'%msg[:2])
self.request.send(info.encode('utf-8')) #相当于conn.recv方法 if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)
# thread 线程
server.allow_reuse_address = True
server.serve_forever()

注:self.request:相当于conn,addr=sk.accept()中的conn。。。。。。。

客户端:

#客户端
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
msg = input('>>>')
if msg == 'q':
sk.send(b'q')
break
sk.send(('美团 :'+msg).encode('utf-8'))
ret = sk.recv(1024).decode('utf-8')
print(ret)
sk.close()

客户端没有socketclient,因为客户端不需要有多个客户端发过来的消息。客户端还是一样进行收发操作。

最新文章

  1. WebMatrix之WebMatrix.Data
  2. mysql查询区分大小写
  3. jquery判断点击事件是否为指定区域
  4. python_day7【模块configparser、XML、requests、shutil、系统命令-面向对象】之篇
  5. javascript深度克隆与javascript的继承实现
  6. AXI总线
  7. Angular Cookies 操作
  8. IDEA热部署(三)---jetty插件调试(转)
  9. DQL、DML、DDL、DCL
  10. SSM框架中常用的配置文件
  11. 使用JAVA数组实现顺序表
  12. 【PAT】B1032 挖掘机技术哪家强(20 分)
  13. grep命令与正则表达式
  14. Python的open函数文件读写线程不安全,logging模型文件读写线程安全!
  15. linux 101 hacks 6history 及相关关键字
  16. 修复eclipse build-helper-maven-plugin 异常
  17. Vue使用,异步获取日期时间后格式成"/Date(1333245600000+0800)/" 转换成正常格式
  18. Filter学习(一)
  19. PIE.NET-SDK插件式二次开发文档
  20. testng失败重跑

热门文章

  1. java httpclient basic授权
  2. 361-基于6U VPX TMS320C6678+XC7K325T 的信号处理板
  3. console.log 不起作用
  4. Java 静态方法、私有方法、常量的使用
  5. Sublime-Text macOS 编译运行armadillo
  6. 对Asycn/Await的研究
  7. Task5.NB_SVM_LDA
  8. Java Web学习笔记之---JSP
  9. MySQL JOIN 多表连接
  10. 51nod1600 Simple KMP