目录格式:

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

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. Arduino 网络时钟client

    升级! 添加了12h/24h 的开关,还有标准/ 夏令时开关!见步骤7 & 步骤8. 你是否曾想要一个和办公室时间来源全然准确的表? 这就有一个网络的办公时间server,你能够根据它并同步你 ...

  2. [Android]Android5.0实现静默接听电话功能

    原因: android曾经能够通过AIDL进行静默接听.可是5.0以后就被谷歌给屏蔽了.这时候我们仅仅能通过其它方式实现了. 解决方式: try { Runtime.getRuntime().exec ...

  3. 标准代码书写 C++ 的string类的用法总结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果 离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是 ...

  4. word2vec学习 spark版

    参考资料: http://ir.dlut.edu.cn/NewsShow.aspx?ID=291 http://www.douban.com/note/298095260/ http://machin ...

  5. 20170225-ALV tree 显示

    1.写程序, 2.话屏幕9000,CALL SCREEN 9000.(双击屏幕进去画个容器就ok,+OK_CODE,+去掉注释) 3.处理好ALV 的PBO 初始化,处理用户事件PAO,user co ...

  6. linux下使用无线网卡的命令行方法(wifi,iwconfig)

    原文地址:linux下使用无线网卡的命令行方法(wifi,iwconfig) 作者:andyhzw (1)首先关闭开发板的有线网卡 [root@FriendlyARM /]# ifconfig eth ...

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

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

  8. eclipse软件启动弹窗端口问题解决

    如果启动eclipse,弹出一个窗口,上面显示,8080 .8009.……等的提示,说明端口有冲突, 解决办法如下: 1.打开cmd 2.输入 netstat   -ano|findstr  8080 ...

  9. iOS自定义提示弹出框(类似UIAlertView)

    菜鸟一枚,大神勿喷.自己在牛刀小试的时候,发现系统的UIAlertView有点不喜欢,然后就自己自定义了一个UIAlertView,基本上实现了系统的UIAlertView,可以根据项目的需求修改UI ...

  10. [Selenium] 如何使ChromeDriver 每次启动的端口不会随机变化

    ChromeDriver  在不指定任何参数的情况下,启动监听端口会随机变化.如果需要保证其端口固定不变,可通过ChromeDriverService 打的目的 public class testCh ...