基于Tcp协议的上传下载

目录格式:

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

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()

原文地址:https://www.cnblogs.com/xiao-xue-di/p/9484096.html

时间: 2024-08-29 22:48:47

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

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

C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Collections; using System.IO; using System.Text.RegularExpressions; using RE = System.Text.Regula

Android开发之网络请求通信专题(二):基于HttpClient的文件上传下载

上一篇专题Android开发之网络请求通信专题(一):基于HttpURLConnection的请求通信我们讲解了如何使用httpurlconnection来实现基本的文本数据传输.一般在实际开发中我们可以用于传输xml或者json格式的数据.今天我们来讲解另外一种http网络请求的方式:httpclient,并实现文件的上传和下载. 在这里插个题外话,其实这些网络请求有很多第三方jar包可以使用,这些包都封装得很好了.如果只是想使用,我们就直接拿别人得jar包来用就好.博主这里推荐一个叫xuti

基于struts2的文件上传下载

1.struts.xml 1 <struts> 2 <constant name="struts.multipart.maxSize" value="209715200" /><!-- 设置文件上传大小,2097152=2M --> 3 <package name="action" extends="struts-default" namespace="/">

基于spring的文件上传下载

package com.zsf.util; import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import o

运用tcp协议创建上传文件

牢记buffered需要刷新flush package loadfile; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; impor

用c++开发基于tcp协议的文件上传功能

用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学阅读,比 APUE 讲的更深入 这是某个银行广告项目(p2p传输视频)的一部分 IO模型采用的阻塞模式,文件一打开就直接上传 用vc 2003编译,生成win32 dll 麻雀虽小五脏俱全,CSimpleSocket,CReadStream dll 输出一虚类 extern "C" __d

网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例

UDP协议 (了解) 称之为数据包协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需先启动服务端再启动客户端 优点: - 传输速度快 - 能支持并发 - 不会粘包 缺点: - 数据不安全, 容易丢失 应用场景: 早期的QQ聊天室. # server端 import socket # socket.SOCK_DGRAM ---> UPD协议 server = socket.socket(type=s

艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项目地址:http://www.51aspx.com/code/MSDCArtMengFileUpload 咨询qq:286275658 演示程序下载地址:http://pan.baidu.com/s/1geVfmcr 服务器端运行效果图: 服务器端配置文件: <?xml version="1.

(转载)基于Bash命令行的百度云上传下载工具

原文链接:http://hi.baidu.com/meoow/item/aef5814bbd5be3e1bcf451e9 这是我根据百度云PCS的API写的一个基于bash的命令行工具, 使用了curl, awk, sed, xxd, bash,没有使用任何其他的语言解释器做辅助 目前,上传下载,文件列表,文件信息,创建文件夹,删除文件都没问题 复制和移动总是返回参数错误,实在找不出来哪里跟API不一致了,暂时放弃. 另外离线下载相关的API也都添加了,但是因为现在百度云不能申请,我是用的是by