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

send()与sendall()

验证客户端

加密验证

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

服务器端

#_*_coding:utf-8_*_
from socket import *#引入套接字的所有模块
import hmac,os#引入两个模块 secret_key=b'linhaifeng bang bang bang'#是指一个固定字符串的key
def conn_auth(conn):#定义函数认证客户端连接
'''
认证客户端链接
:param conn:
:return:
'''
print('开始验证新链接的合法性')#打印提示
msg=os.urandom(32)#随机生成一个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):#数据处理机函数(传入两个参数conn,和设置的默认大小)
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):#服务器处理机ip和端口,设置大小
'''
只处理链接
:param ip_port:
:return:
'''
tcp_socket_server=socket(AF_INET,SOCK_STREAM)#实例化一个tcp的套接字
tcp_socket_server.bind(ip_port)#绑定ip端口
tcp_socket_server.listen(backlog)#监听
while True:#循环为真
conn,addr=tcp_socket_server.accept()#接收链接和地址
print('新连接[%s:%s]' %(addr[0],addr[1]))#打印新连接ip和端口
data_handler(conn,bufsize)#调用数据处理机函数 if __name__ == '__main__':#如果当前用户名=用户名
ip_port=('127.0.0.1',9999)#ip和端口
bufsize=1024#设置字节大小
server_handler(ip_port,bufsize)#服务器处理机得到的参数 服务端

客户端

#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'#作者林海峰
from socket import *#引入所有的套接字模块
import hmac,os#引入hmac摘要和系统模块 secret_key=b'linhaifeng bang bang bang'#设置一个字符串key
def conn_auth(conn):#定义一个客户验证到服务器端的链接
'''
验证客户端到服务器的链接
:param conn:
:return:
'''
msg=conn.recv(32)#接受一个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套接字的对象
tcp_socket_client.connect(ip_port)#链接ip和端口 conn_auth(tcp_socket_client)#链接 while True:#循环为真
data=input('>>: ').strip()#输入内容
if not data:continue#如果没有内容则跳过
if data == 'quit':break#如果输入'quit'则打断 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)#ip和接口
bufsize=1024#设置大小为1024
client_handler(ip_port,bufsize)#的到一个函数传入两个参数

客户端(非法:不知道加密方式)

#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'#作者林海峰
from socket import *#引入伯克利套接字 def client_handler(ip_port,bufsize=1024):#定义客户端处理机函数
tcp_socket_client=socket(AF_INET,SOCK_STREAM)#实例化一个ftp套接字对象
tcp_socket_client.connect(ip_port)#链接ip和端口 while True:#循环为真
data=input('>>: ').strip()#输入数据
if not data:continue#如果没有剖数据则跳过
if data == 'quit':break#如果输入'quit'则中断 tcp_socket_client.sendall(data.encode('utf-8'))#发送数据
respone=tcp_socket_client.recv(bufsize)#接收1024字节数据
print(respone.decode('utf-8'))#打印这个回应
tcp_socket_client.close()#关闭这个链接 if __name__ == '__main__':#如果用户名=当前用户名
ip_port=('127.0.0.1',9999)#ip和端口
bufsize=1024#设置1024
client_handler(ip_port,bufsize)#调用函数传入两个数

客户端(非法:不知道secret_key)

#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'#作者林海峰
from socket import *#引入套接字模块
import hmac,os#引入两个模块 secret_key=b'linhaifeng bang bang bang1111'#设置一个固定的字符串钥匙
def conn_auth(conn):#定义链接处理机函数
'''
验证客户端到服务器的链接
:param conn:
:return:
'''
msg=conn.recv(32)#接受一个32大小的数
h=hmac.new(secret_key,msg)#生成一个bytes摘要
digest=h.digest()#得到摘要
conn.sendall(digest)#发送摘要 def client_handler(ip_port,bufsize=1024):#客户端处理机函数
tcp_socket_client=socket(AF_INET,SOCK_STREAM)#实例化一个tcp套接字
tcp_socket_client.connect(ip_port)#链接这个ip和端口 conn_auth(tcp_socket_client)#调用链接_处理机函数 while True:#循环为真
data=input('>>: ').strip()#输入你的内容
if not data:continue#如果没有数据则跳过
if data == 'quit':break#如果输入quit则退出 tcp_socket_client.sendall(data.encode('utf-8'))#发送数据
respone=tcp_socket_client.recv(bufsize)#接收1024大小的数据
print(respone.decode('utf-8'))#打印这个数据
tcp_socket_client.close()#关闭这个链接 if __name__ == '__main__':#如果当前文件夹的用户名等于这个用户名
ip_port=('127.0.0.1',9999)#ip和端口
bufsize=1024#赋值1024
client_handler(ip_port,bufsize)#使用客户端函数,传入两个参数

二、socketserver

解读socketserver源码 —— http://www.cnblogs.com/Eva-J/p/5081851.html

socketserver模块中包含了socket模块

server端

import socketserver#引入套接字服务器
class Myserver(socketserver.BaseRequestHandler):#定义一个Myserver类继承socketserver.BaseRequestHandler
def handle(self):#定义一个处理机方法
self.data = self.request.recv(1024).strip()#对象的数据=接收的数据
print("{} wrote:".format(self.client_address[0]))#{打印ip地址}写
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()

client端

import socket#引入套接字模块

HOST, PORT = "127.0.0.1", 9999#主机ip和端口
data = "hello"#数据=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))#打印接收到的信息

作业要求:

socketv 验证客户端链接的合法性的更多相关文章

  1. socketv 验证客户端链接的合法性,socketserver

    补充: send()与sendall() 在python socket编程中,有两个发送TCP的函数,send()与sendall(),区别如下: socket.send(string[, flags ...

  2. Python之socketserver模块和验证客户端链接的合法性

    验证客户端链接的合法性 分布式系统中实现一个简单的客户端链接认证功能 #_*_coding:utf-8_*_ from socket import * import hmac,os secret_ke ...

  3. python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver)

     先来回顾一下昨天的内容 黏包现象粘包现象的成因 : tcp协议的特点 面向流的 为了保证可靠传输 所以有很多优化的机制 无边界 所有在连接建立的基础上传递的数据之间没有界限 收发消息很有可能不完全相 ...

  4. python:验证客户端链接的合法性与socketserver

    一.验证客户端链接的合法性 from socket import * import hmac,os secret_key=b'linhaifeng bang bang bang' def conn_a ...

  5. python网络编程之验证客户端链接的合法性

    六.socket的更多方法介绍 服务端套接字函数s.bind() 绑定(主机,端口号)到套接字s.listen() 开始TCP监听s.accept() b被动接收TCP客户的连接,(阻塞式)等待连接的 ...

  6. python (大文件下载及进度条展示) 验证客户端链接的合法性,socketserver

    ##########总结########### 文件校验加进度条显示 ####server import os import json import socket import struct impo ...

  7. python之路----验证客户端合法性

    验证客户端链接的合法性 import os import hmac import socket secret_key = b'egg' sk = socket.socket() sk.bind(('1 ...

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

    一.socket的更多方法介绍 # 服务端套接字函数 s.bind() # 绑定(主机,端口号)到套接字 s.listen() # 开始TCP监听 s.accept() # 被动接受TCP客户的连接, ...

  9. 验证客户端的链接合法性和socketserver模块实现并发

    本节内容: 1.验证客户端的链接合法性 2.socketserver模块实现并发 一.验证客户端的链接合法性 首先,我们来探讨一下,什么叫验证合法性, 举个例子:有一天,我开了一个socket服务端, ...

随机推荐

  1. Linux基本命令(新手入门使用)

    Linux常用基本命令主要包括目录操作命令.文件操作命令.文件查看命令.磁盘管理命令.用户管理命令.系统管理命令等. 目录操作命令:cd.ls.mkdir.pwd.rmdir 文件操作命令:cp.mv ...

  2. [ JAVA编程 ] double类型计算精度丢失问题及解决方法

    前言 如果你在测试金融相关产品,请务必覆盖交易金额为小数的场景.特别是使用Java语言的初级开发. Java基本实例 先来看Java中double类型数值加.减.乘.除计算式实例: public cl ...

  3. 去除文件BOM头工具

    <?php /** * 用法:复制以下代码至新建的php文件中,将该php文件放置项目目录,运行即可.代码来源于网络. * chenwei 注. */ header('content-Type: ...

  4. centos下SVN搭建多个库文件总汇

    1.checkout时,提示:URL svn://192.168.1.99/svntest doesn't exist...奇怪,怎么会提示库不存在呢?肯定是哪里配置问题.后来尝试了半天,也在网上搜索 ...

  5. spark pyspark 常用算法实现

    利用Spark-mllab进行聚类,分类,回归分析的代码实现(python) http://www.cnblogs.com/adienhsuan/p/5654481.html 稀疏向量: 关于Spar ...

  6. SSM商城项目(三)

    1. 学习计划 1.商品类目选择 2.图片上传 a) 图片服务器FastDFS b) 图片上传功能实现 3.富文本编辑器的使用KindEditor 2. 商品类目选择 2.1. 原型 2.2. 功能分 ...

  7. CXF使用JMS作为传输协议的配置

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...

  8. PasteDeploy部署Pecan API 服务

    part 1:请求处理 使用PasteDeploy模块来实现 WSGI Services 时,都需要加载一个 paste.ini 文件,文件用来定义服务过滤和请求路由,类似于springMvc的拦截器 ...

  9. msf客户端渗透(八):持久后门,mimikatz使用,获取PHP服务器shell

    持续后门 先获取一个session 在目标主机上生成持续后门 设置侦听参数 启动侦听 重新启动被攻击的主机 一启动攻击者时获取到session mimikatz的使用 mimikatz是俄罗斯组织开发 ...

  10. appium多机并行测试

    在实际应用中需要对多个机型并行测试,节省时间 多机测试的思路 启动多个appium server与多台机器交互(android和ios均可)   注意:一定要使用node安装appium的命令行,使用 ...