day29 文件的上传和下载 socketserver(并发)
文件上传的讲解:
import subprocess res=subprocess.Popen("dir",
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE) print(res.stdout.read().decode("gbk"))
server
import socket
import os
import json #序列化对象 : 把字典 列表变成字符串 sock=socket.socket()
sock.connect(("127.0.0.1",8800)) while 1 :
cmd=input("请输入命令:") # put 111.jpg action,filename=cmd.strip().split(" ")
filesize=os.path.getsize(filename) file_info={
"action": action,
"filename": filename,
"filesize": filesize,
}
file_info_json=json.dumps(file_info).encode("utf8")
sock.send(file_info_json) # 确认服务端接收到了文件信息
code=sock.recv(1024).decode("utf8")
if code=="":
# 发送文件数据
with open(filename,"rb") as f:
for line in f:
sock.send(line)
else:
print("服务器异常!") ''' '{.....}' 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' '''
client
对上传的文件进行加密校验:
import struct
import socket
import json
import hashlib sock=socket.socket()
sock.bind(('127.0.0.1',8800))
sock.listen(5) while 1:
print("server is working....")
conn,addr= sock.accept()
while 1: # 接收json的打包长度
file_info_length_pack=conn.recv(4)
file_info_length=struct.unpack("i",file_info_length_pack)[0] # 接收json字符串
file_info_json=conn.recv(file_info_length).decode("utf8")
file_info=json.loads(file_info_json) action=file_info.get("action")
filename=file_info.get("filename")
filesize=file_info.get("filesize") # 循环接收文件
md5=hashlib.md5()
with open("put/"+filename,"wb") as f:
recv_data_length=0
while recv_data_length<filesize:
data=conn.recv(1024)
recv_data_length+=len(data)
f.write(data)
# MD5摘要
md5.update(data)
print("文件总大小:%s,已成功接收%s"%(filesize,recv_data_length)) print("接收成功!")
conn.send(b"OK")
print(md5.hexdigest())
md5_val=md5.hexdigest()
client_md5=conn.recv(1024).decode("utf8")
if md5_val==client_md5:
conn.send(b"")
else:
conn.send(b"")
server
import socket
import os
import json
import struct
import hashlib sock=socket.socket()
sock.connect(("127.0.0.1",8800)) while 1 :
cmd=input("请输入命令:") # put 111.jpg action,filename=cmd.strip().split(" ")
filesize=os.path.getsize(filename) file_info={
"action": action,
"filename": filename,
"filesize": filesize,
}
file_info_json=json.dumps(file_info).encode("utf8") ret=struct.pack("i",len(file_info_json))
# 发送 file_info_json的打包长度
sock.send(ret)
# 发送 file_info_json字节串
sock.send(file_info_json)
# 发送 文件数据
md5=hashlib.md5()
with open(filename,"rb") as f:
for line in f:
sock.send(line)
md5.update(line) data=sock.recv(1024)
print(md5.hexdigest())
md5_val=md5.hexdigest()
sock.send(md5_val.encode("utf8"))
is_valid=sock.recv(1024).decode('utf8')
if is_valid=="":
print("文件完整!")
else:
print("文件上传失败!")
client
重要模块 socketserver
内部使用IO多路复合,以及多线程、多进程,从而实现并发处理多个客户端请求的服务器
ThreadingTCPServer
ThreadingTCPServer实现的Soket服务器内部会为每个client创建一个 “线程”,该线程用来和客户端进行交互
1、ThreadingTCPServer基础
使用ThreadingTCPServer:
- 创建一个继承自 SocketServer.BaseRequestHandler 的类
- 类中必须定义一个名称为 handle 的方法
- 启动ThreadingTCPServer
import SocketServer class MyServer(SocketServer.BaseRequestHandler): def handle(self):
# print self.request,self.client_address,self.server
conn = self.request
conn.sendall('欢迎致电 10086,请输入1xxx,0转人工服务.')
Flag = True
while Flag:
data = conn.recv(1024)
if data == 'exit':
Flag = False
elif data == '':
conn.sendall('通过可能会被录音.balabala一大推')
else:
conn.sendall('请重新输入.') if __name__ == '__main__':
server = SocketServer.ThreadingTCPServer(('127.0.0.1',8009),MyServer)
server.serve_forever() SocketServer实现服务器
#!/usr/bin/env python
# -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',8009)
sk = socket.socket()
sk.connect(ip_port)
sk.settimeout(5) while True:
data = sk.recv(1024)
print 'receive:',data
inp = raw_input('please input:')
sk.sendall(inp)
if inp == 'exit':
break sk.close() 客户端
客户端
SocketServer的ThreadingTCPServer之所以可以同时处理请求得益于 select 和 os.fork 两个东西,其实本质上就是在服务器端为每一个客户端创建一个进程,当前新创建的进程用来处理对应客户端的请求,所以,可以支持同时n个客户端链接(长连接)
day29 文件的上传和下载 socketserver(并发)的更多相关文章
- java实现ftp文件的上传与下载
最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...
- 在SpringMVC框架下实现文件的 上传和 下载
在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...
- SecureCRT使用sz和rz命令进行文件的上传和下载
SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...
- 使用FTPClient进行文件服务器内文件的上传和下载
我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...
- iOS开发中文件的上传和下载功能的基本实现-备用
感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...
- Apache FtpServer 实现文件的上传和下载
1 下载需要的jar包 Ftp服务器实现文件的上传和下载,主要依赖jar包为: 2 搭建ftp服务器 参考Windows 上搭建Apache FtpServer,搭建ftp服务器 3 主要代码 在ec ...
- 初学Java Web(7)——文件的上传和下载
文件上传 文件上传前的准备 在表单中必须有一个上传的控件 <input type="file" name="testImg"/> 因为 GET 方式 ...
- java web(四):request、response一些用法和文件的上传和下载
上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...
- 黏包-黏包的成因、解决方式及struct模块初识、文件的上传和下载
黏包: 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包. 只有TCP协议中才会产生黏包,UDP协议中不会有黏包(udp协议中数 ...
随机推荐
- js重点
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 被低估的.NET(下)-2019 中国.NET 开发者峰会
Time flies!不知不觉距离上篇<被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾>和中篇<被低估的.net(中) - 广州.net俱乐部201 ...
- Just For Test
Just For Test
- egg 框架自动创建数据库表结构
// {app_root}/app.js module.exports = app => { app.beforeStart(async () => { // 从配置中心获取 MySQL ...
- 使用Spring Data JPA进行数据分页与排序
一.导读 如果一次性加载成千上万的列表数据,在网页上显示将十分的耗时,用户体验不好.所以处理较大数据查询结果展现的时候,分页查询是必不可少的.分页查询必然伴随着一定的排序规则,否则分页数据的状态很难控 ...
- API gateway 之 kong 基本操作 (三)
一.演示环境准备 1.nginx配置 [root@nginx conf.d]# pwd /etc/nginx/conf.d [root@nginx conf.d]# ls conf_bak kong_ ...
- nginx篇最初级用法之访问认证
1打开conf下的配置文件 在server 之下 location 之上加入 auth_basic "Input Password:"; 弹出的提示信息 auth_basic ...
- nginx篇最初级用法之nginx升级
在不破坏nginx应用程序和配置文件下时,升级nginx. 下载新版本的nginx对其进行编译 使用nginx -V参数获得当前版本和配置参数 nginx version: nginx/1.10.3b ...
- Google I/O 大会上提出的UI优化相关
1.ListView的Adapter Adapter在ListView中的工作原理是: 上图也正好反映出ListView使用了Adapter来适配数据源. 每一个Item条目都是通过Adapter.g ...
- 关于发送邮件,错误“命令顺序不正确。 服务器响应为:Error: need EHLO and AUTH first !”问题
最近做了一个小程序,通过QQ邮箱服务器发送邮件, 代码写完后,运行调试,出现“命令顺序不正确. 服务器响应为:Error: need EHLO and AUTH first !”的问题, 上网查询发现 ...