1.上传下载的简单示例
server:
import socket
import struct
import json
server =socket.socket()
server.bind(('127.0.0.1',8001))
server.listen()
conn,addr = server.accept()
#首先接收文件的描述信息的长度
struct_data_len = conn.recv(4)
data_len = struct.unpack('i',struct_data_len)[0]
#通过文件信息的长度将文件的描述信息全部接收
print('data_len>>>>',data_len)
file_info_bytes =conn.recv(data_len)
# 将文件描述信息转换为字典类型,以便操作
file_info_json = file_info_bytes.decode('utf-8')
file_info_dict = json.loads(file_info_json) ##{'file_name': 'aaa.mp4', 'file_size': 24409470}
print(file_info_dict)
#统计每次接收的累计长度
recv_sum =0
flie_path= 'D:\s18\jj' +'\\' + file_info_dict['file_name']
with open(flie_path, 'wb') as f:
while recv_sum < file_info_dict['fil_size']:
every_recv_data = conn.recv(1024)
recv_sum += len(every_recv_data)
f.write(every_recv_data)
client:
import os
import socket
import json
import struct
client = socket.socket()
client.connect(('127.0.0.1',8001))
#统计文件大小
file_size = os.path.getsize(r'D:\python_workspace_s18\day029\aaa.mp4')
# 统计文件描述信息,给服务端,服务端按照我的文件描述信息来保存文件,命名文件等等,现在放点一个字典里面了
file_info ={
'file_name':'aaa.mp4',
'file_size':file_size
}
#由于字典无法直接为转换成bytes类型的数据,所以需要json来讲字典转换成json字符串,在把字符串转换成字节类型的数据进行发送
#json.dumps是将字典转转换为json字符串的方法
file_info_json = json.dumps(file_info)
#将字符串转换成bytes类型的数据
file_info_byte = file_info_json.encode('utf-8')
#为了防止黏包现象,将文件描述信息的长度打包后和文件的描述信息的数据一起发送过去
data_len = len(file_info_byte)
data_len_struct = struct.pack('i',data_len)
#发送文件描述信息
client.send(data_len_struct+file_info_byte)
#定义一个变量,=0,作为每次读取文件的长度的累计值
sum = 0
#打开的aaa.mp4文件,rb的形式
with open('aaa.mp4','rb') as f:
#循环读取文件内容
while sum < file_size:
#每次读取的文件内容,每次读取1024B大小的数据
every_read_data = f.read(1024)
#将每次读取的文件的真实数据反送给服务器
sum +=len(every_read_data)
client.send(every_read_data)
2.socketserver模块实现并发
用socketserver可以实现和多个客户端通信,它是在socket的基础上进行了一层封装,也就是说底层还是调用的socket.
实例:
server端:
import socketserver
# 自己写一个类,类名自己随便定义,然后继承socketserver这个模块里面的类BaseRequestHandler
class Myserver(socketserver.BaseRequestHandler):
#写一个handle方法,必须叫这个名字
def handle(self):
#self.request #self.request相当于一个conn
while 1:
from_client_msg = self.request.recv(1024) #self.request = conn
print(from_client_msg.decode('utf-8'))
msg = input('服务端说:')
self.request.send(msg.encode('utf-8')) #发消息
#拿到了我们队每个客户端的通道,那么我们自己在这个方法里面就写我们接收消息和发送消息的逻辑就可以了
if __name__ == '__main__':
ip_port = ('127.0.0.1',8001)
#设置 allow_reuse_adress允许服务器重用地址
socketserver.TCPServer.allow_reuse_adress = True
#thread线程
#使用socketserver的ThreadingTCPServer这个类,将ip和端口的元组传进去,还需要将上面咱么定义的类传进去,得到一个对象相当于我们通过它进行了bind,listen
server = socketserver.ThreadingTCPServer(ip_port,Myserver)
#使用我们上面这个类型的对象来执行server_foever()这个方法,服务会一直开启,就先京东网站一样,不能关闭网站,server_foever()帮我们进行了accept
server.serve_forever()
client端:
import socket
# 创建一个socket链接,SOCK_STREAM代表使用TCP协议
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接到客户端
client.connect(('127.0.0.1',8001))
while 1:
msg = input('客户端说:')
client.send(msg.encode('uft-8'))
from_server_msg = client.recv(1024)
print(from_server_msg.decode('utf-8'))
3.验证客户端的连接合法性
首先介绍两种方法:
1.os.urandom(n)
其中os.urandom(n)是一种bytes类型的随机生成n个字节字符串的方法,而且每次生成的值都不相同。再加上md5等加密的处理。就能够形成不同长度相同的字符串了。
os.urandom(n)函数在python官方文档中做出了这样的解释
函数定位:Return a string of n random bytessuitable for cryptographic use.
意思就是,返回一个有n个bytes那么长的string,然后很适合加密。
然后在这个函数中,在文档中,被归结于os这个库的Miscellaneous Functions,意思是不同种类的函数(也可以说是混种函数)
原因是:This function returns random bytes from an OS-specific randomness source
(函数返回的随机字节是根据不同的操作系统特定的随机函数资源。即,这个函数是调用OS内部自带的随机函数,有特异性)
使用的方法:
import os
from hashlib import md5
for i in range(10):
print (md5(os.urandom(24)).hexdigest())
2.hamc:我们完全可以用hashlib来实现,python自带的hmac模块实现了标准的Hmac算法,首先需要准备待计算的原始消息message,随机key,哈希算法,这里采用MD5,使用hmac的代码如下:
可见的使用hmac和普通hash算法非常类似,hmac输出的长度和原始哈希算法的长度一致。需要注意的是传入的key和message都是bytes类型,str类型需要首先编码bytes。
import hmac
import random
message = b'Hello world'
key = b'secret'
h = hmac.new(key,message,digestmod='MD5')
print(h.hexdigest())
# 比较两个密文是否相同,可以用hmac.compara_digest(密文,密文),会返回True或者False。def hmac_md5(key,s):
return hmac.new(key.encode('utf-8'),s.encode('utf-8'),'MD5').hexdigest()
class User(object):
def __init__(self,username,password):
self.username = username
self.key = ''.join([chr(random.randint(48,122)) for i in range(20)])
self.password = hmac_md5(self.key,password)
验证客户端合法性连接实例
server端:
from socket import *
import hmac,os
secret_key =b'Jedan has a big key!'
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)
client端:
from socket import *
import hmac,os
secret_key =b'Jedan has a big key!'
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)
1.上传下载的简单示例
server:
import socket
import struct
import json
server =socket.socket()
server.bind(('127.0.0.1',8001))
server.listen()
conn,addr = server.accept()
#首先接收文件的描述信息的长度
struct_data_len = conn.recv(4)
data_len = struct.unpack('i',struct_data_len)[0]
#通过文件信息的长度将文件的描述信息全部接收
print('data_len>>>>',data_len)
file_info_bytes =conn.recv(data_len)
# 将文件描述信息转换为字典类型,以便操作
file_info_json = file_info_bytes.decode('utf-8')
file_info_dict = json.loads(file_info_json) ##{'file_name': 'aaa.mp4', 'file_size': 24409470}
print(file_info_dict)
#统计每次接收的累计长度
recv_sum =0
flie_path= 'D:\s18\jj' +'\\' + file_info_dict['file_name']
with open(flie_path, 'wb') as f:
while recv_sum < file_info_dict['fil_size']:
every_recv_data = conn.recv(1024)
recv_sum += len(every_recv_data)
f.write(every_recv_data)
client:
import os
import socket
import json
import struct
client = socket.socket()
client.connect(('127.0.0.1',8001))
#统计文件大小
file_size = os.path.getsize(r'D:\python_workspace_s18\day029\aaa.mp4')
# 统计文件描述信息,给服务端,服务端按照我的文件描述信息来保存文件,命名文件等等,现在放点一个字典里面了
file_info ={
'file_name':'aaa.mp4',
'file_size':file_size
}
#由于字典无法直接为转换成bytes类型的数据,所以需要json来讲字典转换成json字符串,在把字符串转换成字节类型的数据进行发送
#json.dumps是将字典转转换为json字符串的方法
file_info_json = json.dumps(file_info)
#将字符串转换成bytes类型的数据
file_info_byte = file_info_json.encode('utf-8')
#为了防止黏包现象,将文件描述信息的长度打包后和文件的描述信息的数据一起发送过去
data_len = len(file_info_byte)
data_len_struct = struct.pack('i',data_len)
#发送文件描述信息
client.send(data_len_struct+file_info_byte)
#定义一个变量,=0,作为每次读取文件的长度的累计值
sum = 0
#打开的aaa.mp4文件,rb的形式
with open('aaa.mp4','rb') as f:
#循环读取文件内容
while sum < file_size:
#每次读取的文件内容,每次读取1024B大小的数据
every_read_data = f.read(1024)
#将每次读取的文件的真实数据反送给服务器
sum +=len(every_read_data)
client.send(every_read_data)
2.socketserver模块实现并发
用socketserver可以实现和多个客户端通信,它是在socket的基础上进行了一层封装,也就是说底层还是调用的socket.
实例:
server端:
import socketserver
# 自己写一个类,类名自己随便定义,然后继承socketserver这个模块里面的类BaseRequestHandler
class Myserver(socketserver.BaseRequestHandler):
#写一个handle方法,必须叫这个名字
def handle(self):
#self.request #self.request相当于一个conn
while 1:
from_client_msg = self.request.recv(1024) #self.request = conn
print(from_client_msg.decode('utf-8'))
msg = input('服务端说:')
self.request.send(msg.encode('utf-8')) #发消息
#拿到了我们队每个客户端的通道,那么我们自己在这个方法里面就写我们接收消息和发送消息的逻辑就可以了
if __name__ == '__main__':
ip_port = ('127.0.0.1',8001)
#设置 allow_reuse_adress允许服务器重用地址
socketserver.TCPServer.allow_reuse_adress = True
#thread线程
#使用socketserver的ThreadingTCPServer这个类,将ip和端口的元组传进去,还需要将上面咱么定义的类传进去,得到一个对象相当于我们通过它进行了bind,listen
server = socketserver.ThreadingTCPServer(ip_port,Myserver)
#使用我们上面这个类型的对象来执行server_foever()这个方法,服务会一直开启,就先京东网站一样,不能关闭网站,server_foever()帮我们进行了accept
server.serve_forever()
client端:
import socket
# 创建一个socket链接,SOCK_STREAM代表使用TCP协议
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接到客户端
client.connect(('127.0.0.1',8001))
while 1:
msg = input('客户端说:')
client.send(msg.encode('uft-8'))
from_server_msg = client.recv(1024)
print(from_server_msg.decode('utf-8'))
3.验证客户端的连接合法性
首先介绍两种方法:
1.os.urandom(n)
其中os.urandom(n)是一种bytes类型的随机生成n个字节字符串的方法,而且每次生成的值都不相同。再加上md5等加密的处理。就能够形成不同长度相同的字符串了。
os.urandom(n)函数在python官方文档中做出了这样的解释
函数定位:Return a string of n random bytessuitable for cryptographic use.
意思就是,返回一个有n个bytes那么长的string,然后很适合加密。
然后在这个函数中,在文档中,被归结于os这个库的Miscellaneous Functions,意思是不同种类的函数(也可以说是混种函数)
原因是:This function returns random bytes from an OS-specific randomness source
(函数返回的随机字节是根据不同的操作系统特定的随机函数资源。即,这个函数是调用OS内部自带的随机函数,有特异性)
使用的方法:
import os
from hashlib import md5
for i in range(10):
print (md5(os.urandom(24)).hexdigest())
2.hamc:我们完全可以用hashlib来实现,python自带的hmac模块实现了标准的Hmac算法,首先需要准备待计算的原始消息message,随机key,哈希算法,这里采用MD5,使用hmac的代码如下:
可见的使用hmac和普通hash算法非常类似,hmac输出的长度和原始哈希算法的长度一致。需要注意的是传入的key和message都是bytes类型,str类型需要首先编码bytes。
import hmac
import random
message = b'Hello world'
key = b'secret'
h = hmac.new(key,message,digestmod='MD5')
print(h.hexdigest())
# 比较两个密文是否相同,可以用hmac.compara_digest(密文,密文),会返回True或者False。def hmac_md5(key,s):
return hmac.new(key.encode('utf-8'),s.encode('utf-8'),'MD5').hexdigest()
class User(object):
def __init__(self,username,password):
self.username = username
self.key = ''.join([chr(random.randint(48,122)) for i in range(20)])
self.password = hmac_md5(self.key,password)
验证客户端合法性连接实例
server端:
from socket import *
import hmac,os
secret_key =b'Jedan has a big key!'
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)
client端:
from socket import *
import hmac,os
secret_key =b'Jedan has a big key!'
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)
- Python socketserver ftp功能简单讲解
socketserver模块实现并发 为什么要讲socketserver?我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信.它 ...
- python之socketserver ftp功能简单讲解
TCP协议中的socket一次只能和一个客户端通信,然而socketserver可以实现和多个客户端通信. 它是在socket的基础上进行了一层封装,底层还是调用的socket # 服务端 impor ...
- socketserver + ftp
--------------------------------------------生活不止眼前的苟且,还有诗和远方的田野. day 29 socketserver + ftp # # ----- ...
- day29 socketsever ftp功能简单讲解
今日所学 一.ftp上传简单实例 二.socketsever的固定用法 三.验证合法性连接 1.ftp上传实例 这个题目是我们现在网络编程比较基础一点的题目 下面我们只写简单上传的代码 上传服务端的代 ...
- python socketserver ftp上传功能
一.socketserver用于多个客户端访问同一个服务端 客户端 import socket client = socket.socket() ip_port = ('127.0.0.1',8001 ...
- FTP的搭建与虚拟目录作用<之简单讲解>
操作系统:win7 VS2010编写WebService与在IIS的发布<之简单讲解>中我已经说了IIS安装与使用,不明白的可以跳过去看. 1.添加FTP站点 2. 3. 4. 5. zq ...
- 网络编程4 网络编程之FTP上传简单示例&socketserver介绍&验证合法性连接
今日大纲: 1.FTP上传简单示例(详细代码) 2.socketserver简单示例&源码介绍 3.验证合法性连接//[秘钥加密(urandom,sendall)(注意:中文的!不能用)] 内 ...
- 29 Socketserver和 ftp
一.Socketserver #服务端 import socketserver class KnightServer(socketserver.BaseRequestHandler): def han ...
- Android事件总线分发库EventBus3.0的简单讲解与实践
Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Han ...
随机推荐
- 密码存储中MD5的安全问题与替代方案
md5安全吗?有多么地不安全?如何才能安全地存储密码?... md5安全吗? 经过各种安全事件后,很多系统在存放密码的时候不会直接存放明文密码了,大都改成了存放了 md5 加密(hash)后的密码,可 ...
- 扩展javascript原生对象
原文地址: http://javascript.info/tutorial/native-prototypes 原生的javascript 对象在prototypes里面保存他们可用的方法. 比如,当 ...
- 使用 Azure CLI 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager 部署模型
以下步骤演示如何使用 Azure 命令行接口 (CLI) 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型. 本文中的操作需要 Az ...
- 事件循环进阶:macrotask与microtask
这段参考了参考来源中的第2篇文章(英文版的),(加了下自己的理解重新描述了下), 这里没法给大家演示代码,我就简单说下我的理解吧. promise和settimeout 在一起的时候执行顺序是个有意思 ...
- nginx 开启gzip压缩--字符串压缩比率很牛叉
刚刚给博客加了一个500px相册插件,lightbox引入了很多js文件和css文件,页面一下子看起来非常臃肿,所以还是把Gzip打开了. 环境:Debian 6 1.Vim打开Nginx配置文件 v ...
- 安装和测试Kafka
本文主要介绍如何在单节点上安装 Kafka 并测试 broker.producer 和 consumer 功能. 下载 进入下载页面:http://kafka.apache.org/downloads ...
- 浅谈js冒泡事件1
什么是JS事件冒泡?: 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这 ...
- hdu-2886 Special Prime---数论推导
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2866 题目大意: 问你1到L中有多少个素数满足n^3 + p*n^2 = m^3(其中n,m为大于1 ...
- Axure RP 8 学习记录
一.Axure RP 简介 Axure是一个专业的快速原型设计工具.能够快速创建应用软件或Web网站的线框图.流程图.原型和规格说明文档. 二.Axure RP下载 1.下载安装包 https://w ...
- js获取给定时间的下一天
//获取给定时间的下一天 yyyy-MM-dd格式 function getNextDay(d){ d = new Date(d); d = +d + 1000*60*60*24; d = new D ...