目录格式:

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

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. 关于UDID和UUID的区别

    关于UDID和UUID的区别   一.UDID(Unique Device Identifier) UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识. 在很多需 ...

  2. java接口的一些想法

    最近一直在闷头往前看<thingking in java> ,但是却由于赶了进度而忘记了初衷.当学到集合的时候,回头却发现,我连最基本的接口都不明白.查了一上午资料,现在明白例如一点点,写 ...

  3. Java小日历

    自己写的一个小小日历.执行程序是柯自己主动定位到当前年月日,当点击下个月button是会定位到下个月的这一天,就是说天数不会变.当在一个月中点击某一天时,以下的时间也会随时变化. import jav ...

  4. Codeforces Round #426 (Div. 2) D. The Bakery 线段树优化DP

    D. The Bakery   Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought req ...

  5. andfix使用

    1.andfix简介 AndFix是一个Android App的在线热补丁框架.使用此框架,我们能够在不重复发版的情况下,在线修改App中的Bug.AndFix就是 “Android Hot-Fix” ...

  6. POJ3278 Catch That Cow —— BFS

    题目链接:http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total S ...

  7. YTU 2481: 01字串

    2481: 01字串 时间限制: 1 Sec  内存限制: 128 MB 提交: 103  解决: 72 题目描述 对于长度为7位的一个01串,每一位都可能是0或1,一共有128种可能.它们的前几个是 ...

  8. 织梦dedecms中修改标题与简略标题长度的方法

    本文介绍了dedecms中修改标题与简略标题长度的方法,进入dedecms后台,系统——系统基本参数——其他选项——文档标题最大长度——在这修改为200或更大. 一.修改标题 进入dedecms后台, ...

  9. LoadRunner 技巧之 IP欺骗

    IP欺骗也是也loadrunner自带的一个非常有用的功能. 需要使用ip欺骗的原因:1.当某个IP的访问过于频繁,或者访问量过大是,服务器会拒绝访问请求,这时候通过IP欺骗可以增加访问频率和访问量, ...

  10. iOS在一个label中显示不同颜色的字体

    UILabel *Label = [[UILabel alloc] initWithFrame:CGRectMake(20, 300, 300, 30)]; NSMutableAttributedSt ...