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协议中数 ...
随机推荐
- Redis(十四)Redis 在Java Web 中的应用
在传统的 Java Web 项目中,使用数据库进行存储数据,但是有一些致命的弊端,这些弊端主要来自于性能方面. 由于数据库持久化数据主要是面向磁盘,而磁盘的读/写比较慢,在一般管理系统中,由于不存在高 ...
- python编译器的安装和pycharm的安装
python编译器的安装 进入官网https://www.python.org/,根据提示安装 安装python编译器 pychram安装 下载地址: https://www.jetbrains.co ...
- DirectX9:第一章 初始化Direct3D
一.Direct3D概述 Direct3D是一套底层图形API,可以被视为应用程序与图形设备交互的中介. 应用程序.Direct3D以及硬件之间的交互关系: 在Direct3D和图形设备之间有一个环节 ...
- 2018.8.3 python中的set集合及深浅拷贝
一.字符串和列表的相互转化 之前写到想把xx类型的数据转化成yy类型的数据,直接yy(xx)就可以了,但是字符串和列表的转化比较特殊,相互之间的转化要通过join()和split()来实现. 例如: ...
- Ios 开发 mac cocoaPods的环境搭建
CocoaPods不多介绍,一个大家几乎都会使用的第三方库的管理框架! 本文主要介绍如何安装和使用CocoaPods,本人亲测可行. 1.Ruby环境搭建 查看下当前ruby版本: ruby -v 更 ...
- MapReduce 人个理解
1.MapReduce 理解 拆分成 map 过程与 reduce 过程: map 可以理解为sql 中的 group by 操作, reduce相当于group by 后的聚合计算 : 一个map ...
- Kubernetes4-web管理界面
一.简介 1.环境 环境还是前面的环境 2.Kubernetes Dashboard web界面 kubernetes dashboard (仪表盘)是一个将通用的基于web的监控和操作界面加入kub ...
- python接口测试-数据驱动-DDT
DDT是python的第三方库,全名称为:Data-Driven/Decorated Tests. ddt安装 通过pip安装ddt模块,安装Python后,Python自带pip功能包 切换到Pyt ...
- Java描述设计模式(18):享元模式
本文源码:GitHub·点这里 || GitEE·点这里 一.使用场景 应用代码 public class C01_InScene { public static void main(String[] ...
- Mybatis中多表关联时,怎么利用association优雅写resultMap来映射vo
前言 有好一阵没碰mybatis了,这次的项目基于性能考虑,选了mybatis,写着写着,发现有下面的需求,比如两表联查,取其中各一部分字段,怎么更方便地用vo来接,这里犯了难: 我想的是,因为这个s ...