目录格式:

构建此目录就可随意使用!

client端

import socket
import sys
import os
import json
import struct sk = socket.socket()
adress = ('192.168.12.11', 29231) def upload():
message = {'filename': None, 'filesize': None}
sk.connect(adress)
temp = '上传'
sk.send(temp.encode('utf-8'))
meg = input('输入文件路径:')
filename = os.path.basename(meg)
filesize = os.path.getsize(meg)
message['filename'] = filename
message['filesize'] = filesize
str_message = json.dumps(message)
len_message = len(str_message)
b_len_message = struct.pack('i', len_message)
sk.send(b_len_message + str_message.encode('utf-8'))
with open(meg, 'rb') as f:
while filesize:
connent = f.read()
sk.send(connent)
filesize -= len(connent) def download():
path = os.path.dirname(os.path.abspath(__file__))
sk.connect(adress)
temp = '下载'
sk.send(temp.encode('utf-8'))
num = sk.recv(1024).decode('utf-8')
print('可下载文件:%s' % (num,))
name = input('输入下载文件名称:')
sk.send(name.encode('utf-8'))
path = '/'.join([path, '本地文件', name])
b_len_message = sk.recv(4)
len_message = struct.unpack('i', b_len_message)[0]
res_s = sk.recv(len_message).decode('utf-8')
str_message = json.loads(res_s)
filesize = str_message['filesize']
with open(path, 'ab') as f:
while filesize:
connent = sk.recv(1024)
f.write(connent)
f.flush()
filesize -= len(connent) def main():
dic = [
('上传', 'upload'),
('下载', 'download')
]
for i in enumerate(dic, 1):
print(i[0], i[1][0])
num = int(input('请输入选项:'))
getattr(sys.modules[__name__], dic[num - 1][1])()
sk.close() if __name__ == '__main__':
main()

server端

import socket
import struct
import os
import json path = os.path.abspath(__file__)
path = os.path.dirname(path)
sk = socket.socket()
adress = ('0.0.0.0', 29231)
sk.bind(adress)
sk.listen(4)
conn, addr = sk.accept() def upload(path):
b_len_message = conn.recv(4)
len_message = struct.unpack('i', b_len_message)[0]
res_s = conn.recv(len_message).decode('utf-8')
str_message = json.loads(res_s)
filename = '1' + str_message['filename']
filesize = str_message['filesize']
path = '/'.join([path, '客户端上传的文件', filename])
with open(path, 'ab') as f:
while filesize:
connent = conn.recv(1024)
f.write(connent)
f.flush()
filesize -= len(connent) def download(path):
message = {'filename': None, 'filesize': None}
res = os.listdir('/'.join([path, '客户端上传的文件']))
sum = ''
for i in res:
sum = sum + ' ' + i + ' '
conn.send(sum.encode('utf-8'))
filename = conn.recv(1024).decode('utf-8')
path = '/'.join([path, '客户端上传的文件', filename])
filesize = os.path.getsize(path)
message['filename'] = path
message['filesize'] = filesize
str_message = json.dumps(message)
len_message = len(str_message)
b_len_message = struct.pack('i', len_message)
conn.send(b_len_message + str_message.encode('utf-8')) with open(path, 'rb') as f:
while filesize:
connent = f.read()
conn.send(connent)
filesize -= len(connent) def main():
res_s = conn.recv(1024).decode('utf-8')
if res_s == '上传':
upload(path)
sk.close()
if res_s == '下载':
download(path)
sk.close() if __name__ == '__main__':
while 1:
main()

基于Tcp协议的上传下载的更多相关文章

  1. C#实现http协议支持上传下载文件的GET、POST请求

    C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; usin ...

  2. Linux shell:FTP(文件传输协议)上传下载命令

    SecureCRT通过ftp将nmon上传,建立一个目录,用命令上传文件.[命令见下面] 或通过UE.SSH上传/下载,使用sftp建立链接. [通过cmd进入ftp服务器]先假设有一FTP服务器,F ...

  3. java 26 - 9 网络编程之 TCP协议多用户上传文件

    TCP实现多用户上传文件: 需要同时给多用户上传文件,这样就得用多线程来实现. 实际上,这样的话,上传的先后顺序和速度就跟客户端的带宽有关:带宽够,就容易抢占到线程的执行权: 首先,创建个线程类:(这 ...

  4. 基于struts2--实现文件上传下载

    1. 文件的上传: 1). 表单需要注意的 3 点 ①. method="post"     ②. enctype="mulitipart/form-data" ...

  5. Java 网络编程 -- 基于TCP实现文件上传

    Java TCP 操作基本流程 一.创建服务器 1.指定端口, 使用serverSocket创建服务器 2.阻塞式连接 accept 3.操作:输入流 输出流 4.释放资源 二.创建客户端 1.使用S ...

  6. Java网络编程(TCP协议-练习-上传文本文件)

    客户端: package WebProgramingDemo; import java.io.BufferedReader; public class UploadTextClient { /** * ...

  7. JAVA 基于TCP协议的一对一,一对多文件传输实现

    最近老师给我们上了多线程和TCP和UDP协议,其中一个要求就是我们用JAVA协议一个基于TCP和UDP这两种协议的一对一文件上传和一对多文件上传. 然后我就开始分析TCP和UDP这两个协议的特点,发现 ...

  8. Java实现FTP批量大文件上传下载篇1

    本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...

  9. 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)

    1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...

随机推荐

  1. GuozhongCrawler系列教程 (5) TransactionRequest具体解释

    为了实现和维护并发抓取的属性信息提供线程安全的事务请求.TransactionRequest是一个抽象类自己不能设置Processor,却须要实现 TransactionCallBack接口.Tran ...

  2. JavaScript重点记忆

    String的常用方法 indexOf() 返回字符串中检索指定字符第一次出现的位置 lastIndexOf() 返回字符串中检索指定字符最后一次出现的位置 match() 找到一个或多个正则表达式的 ...

  3. 微信的API都是通过https调用实现的,分为post方法调用和get方法调用。不需要上传数据的采用get方法(使用IntraWeb开发)

    首先需要明确的是,微信的API都是通过https调用实现的,分为post方法调用和get方法调用.不需要上传数据的采用get方法(例如获取AccessToken),而需要向微信服务器提交数据的采用po ...

  4. POJ 2739 Sum of Consecutive Prime Numbers( *【素数存表】+暴力枚举 )

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19895 ...

  5. 织梦dedecms标签调用集合,绝对是仿站必备利器

    今天分享下整理了织梦dedecms标签调用集合,绝对是仿站必备利器啊,觉得有用就转走吧!温馨小提示:CTRL+F 搜索你需要的标签名,就可以方便找到:织梦dedecms标签调用集合-首页标签:网站导航 ...

  6. codeforces 445B. DZY Loves Chemistry 解题报告

    题目链接:http://codeforces.com/problemset/problem/445/B 题目意思:给出 n 种chemicals,当中有 m 对可以发生反应.我们用danger来评估这 ...

  7. codeforces 433C. Ryouko's Memory Note 解题报告

    题目链接:http://codeforces.com/problemset/problem/433/C 题目意思:一本书有 n 页,每页的编号依次从 1 到 n 编排.如果从页 x 翻到页 y,那么| ...

  8. Linux 下WAS的java版本查看

    1.查找linux的详细版本号: A.cat /proc/version B.lsb_release -a(可以查出是否为redhat开发的) C.uname -a 2.Linux的java版本 A. ...

  9. codeforces 414B B. Mashmokh and ACM(dp)

    题目链接: B. Mashmokh and ACM time limit per test 1 second memory limit per test 256 megabytes input sta ...

  10. MyBatis学习 之 五、MyBatis配置文件

    在定义sqlSessionFactory时需要指定MyBatis主配置文件: <bean id="sqlSessionFactory" class="org.myb ...