目录格式:

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

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. JfreeChart折线图 CSDN-李鹏飞

    今天公司里分配给我的工作是JfreeChart折线图本人之前也没接触过如今让我们大家一起完毕! 在这个公司,用到了太多的JfreeChart,今天就对折线图作一个总结,希望对大家有点帮助,我这里直接是 ...

  2. chrome自带的调试工具

    由于项目需要加载webgl对浏览器内存压力很大,需要优化内存,网上找了一下资料,极力推荐chrome的开发文档 https://developers.google.cn/web/tools/chrom ...

  3. ios+Appium+Java

    To run iOS tests, you can follow these steps : (Note : I am using Java language here in Eclipse IDE ...

  4. UVA 10887 Concatenation of Languages 字符串hash

    题目链接:传送门 题意: 给你两个集合A,B,任意组合成新的集合C(去重) 问你最后C集合大小 题解: 暴力 组成的新串hash起来 #include<bits/stdc++.h> usi ...

  5. js中return的作用

    1.终止函数的继续运行. 当遇到if…… else是.若出现return,就会出现终止运行,不会继续做出判断 <html> <head> <title>return ...

  6. YTU 2443: C++习题 复数类--重载运算符3+

    2443: C++习题 复数类--重载运算符3+ 时间限制: 1 Sec  内存限制: 128 MB 提交: 1368  解决: 733 题目描述 请编写程序,处理一个复数与一个double数相加的运 ...

  7. HDU - 1269 迷宫城堡(有向图的强连通分量)

    d.看一个图是不是强连通图 s.求出强连通分量,看看有没有一个强连通分量包含所有点. c.Tarjan /* Tarjan算法 复杂度O(N+M) */ #include<iostream> ...

  8. skynet源码阅读<4>--定时器实现

    昨天和三石公聊天,他提到timer的实现原理,我当时迟疑了一下,心想timer不是系统底层时钟中断驱动上层进程/线程,累积计时实现的么?他简述了timer的实现,什么堆排序,优先级队列等,与我想象的不 ...

  9. hdu-5718 Oracle(水题)

    题目链接: Oracle Time Limit: 8000/4000 MS (Java/Others)     Memory Limit: 262144/262144 K (Java/Others) ...

  10. Map集合的几种遍历方式

    Map<String ,String> map=new HashMap<String,String>(); map.put("1","value1 ...