文件上传的讲解:

 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(并发)的更多相关文章

  1. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

  2. 在SpringMVC框架下实现文件的 上传和 下载

    在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...

  3. SecureCRT使用sz和rz命令进行文件的上传和下载

    SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...

  4. 使用FTPClient进行文件服务器内文件的上传和下载

    我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...

  5. iOS开发中文件的上传和下载功能的基本实现-备用

    感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...

  6. Apache FtpServer 实现文件的上传和下载

    1 下载需要的jar包 Ftp服务器实现文件的上传和下载,主要依赖jar包为: 2 搭建ftp服务器 参考Windows 上搭建Apache FtpServer,搭建ftp服务器 3 主要代码 在ec ...

  7. 初学Java Web(7)——文件的上传和下载

    文件上传 文件上传前的准备 在表单中必须有一个上传的控件 <input type="file" name="testImg"/> 因为 GET 方式 ...

  8. java web(四):request、response一些用法和文件的上传和下载

    上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...

  9. 黏包-黏包的成因、解决方式及struct模块初识、文件的上传和下载

    黏包: 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包. 只有TCP协议中才会产生黏包,UDP协议中不会有黏包(udp协议中数 ...

随机推荐

  1. laravel6.0控制器-资源控制器

    控制器:控制器用来处理业务的,不应该处理逻辑,如果是小项目可以把逻辑写到控制器里,大点的项目应该抽离出来业务处理层如下:services业务处理层:比如:获取值,验证值,异常捕获命名规则:控制器名:用 ...

  2. 一分钟带你了解JWT认证!

    目录 一.JWT简介 二.JWT认证和session认证的区别 三.JWT认证流程 四.JWT组成 五.JWT使用场景 一.JWT简介 JSON Web Token(JWT)是一个开放的标准(RFC ...

  3. Docker应用部署

    MySQL: #拉取mysql镜像 docker pull centos/mysql--centos7 #创建容器 #-p 端口映射 -e添加环境变量MYSQL_ROOT_PASSWORD 是root ...

  4. 洛谷P2107 【小Z的AK计划】

    #include<iostream> #include<queue> #include<algorithm> using namespace std; struct ...

  5. ArcSDE 10 for SQL Server安装教程(含下载链接)

    亲测:ArcSDE 10.1适用于ArcGIS10.2的版本. 该版本支持SQL Server.Oracle.PostgreSQL等数据库连接 下载链接(含安装包和授权文件): 链接:https:// ...

  6. 学习笔记15_ASP母版页

    *网页母版页设计通用样式#header:{height:100px;width:1000px}#leftDiv:{float:left;width:200px}#mainDiv:{margin-lef ...

  7. Spring Boot实战之定制type Formatters

    本文首发于个人网站:Spring Boot实战之定制type Formatters 前面我们有篇文章介绍了PropertyEditors,是用来将文本类型转换成指定的Java类型,不过,考虑到Prop ...

  8. [git]将代码上传到github

    1.右键你的项目,如果你之前安装git成功的话,右键会出现两个新选项,分别为Git Gui Here,Git Bash Here,这里我们选择Git Bash Here,进入如下界面 2.接下来输入如 ...

  9. php session获取不到的解决方法

    php session获取不到的解决方法 因为sesson数据是存在服务器端的硬盘一般临时空间不足 /tmp/ 1 这个需要清空下系统盘就可以了2 你可以在空间充足的地方mkdir 文件夹——你可以使 ...

  10. egret Tiledmap编写障碍物的思路

    egret Tiledmap编写障碍物的思路 获取控制对象下一刻移动的坐标,将其转换成瓦片坐标,如果getTileGIDAt(根据瓦片坐标获取瓦片id)的值不为0,说明对象将要移动的位置有障碍物,不做 ...