进阶版socket套接字ftp文件传输可并发

server

import socketserver
import json
import struct
class Mytcp(socketserver.BaseRequestHandler):
    def handle(self):
        try:
            while True:
                data_path = self.request.recv(1024)
                data = str(data_path,encoding='utf8')
                print(data_path)
                with open(data,'rb') as f:
                    data = f.read()
                dic = {'size':len(data)}
                dic_b = bytes(json.dumps(dic).encode('utf-8'))
                obj = struct.pack('i',len(dic_b))
                self.request.send(obj)
                self.request.send(dic_b)
                self.request.send(data)
                if len(data) == 0:
                    return
        except Exception:
            pass
if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1',8009),Mytcp)
    server.serve_forever()

client

from db import db_handler
from conf import setting
import os
import struct
import json
import socket
user_auth = {'user':None}
def register():
    username = input('请输入账号')
    pwd  = input('密码')
    flg = db_handler.read(username)
    if not flg:
        dic = {'username':username,'pwd':pwd}
        db_handler.save(username,dic)
        print('用户创建成功')
    else:
        print('用户已存在')

def login():
    username = input('请输入账号')
    pwd = input('密码')
    data = db_handler.read(username)
    if data:
        if data['pwd'] == pwd:
            print('登录成功')
            user_auth['user'] = username
    else:
        print('用户不存在')

def upload():
    address = input('请输入要上传的地址')
    name = input('请输入名字')
    data = db_handler.read('downlist')
    data[name] = address
    db_handler.save('downlist',data)
    print('上传成功')

def download():
    path_dic = db_handler.read('downlist')
    for i in path_dic:
        print(i)
    dic_name = input('请输入你要下载的文件')
    if dic_name not in path_dic:
        print('没有此文件')
        return
    dic_path = path_dic[dic_name]
    s = socket.socket()
    s.connect(('127.0.0.1',8009))

    s.send(dic_path.encode('utf8'))
    print('下载中')
    head_dic_len = s.recv(4)
    head_l = struct.unpack('i', head_dic_len)[0]
    dic_byte = s.recv(head_l)
    head = json.loads(dic_byte)
    l = head['size']
    count = 0
    data_total = b''
    print('下载中')
    while count < l:
        if l < 65535:
            data = s.recv(l)
        else:
            if l - count >= 65535:
                data = s.recv(65535)
            else:
                data = s.recv(l - count)
        data_total += data
        count += len(data)
    path = os.path.join(setting.DB_PATH,'Download',dic_name)
    with open(path,'wb') as f:
        f.write(data_total)
    print('下载完成')
    s.close()

def run():
    msg = '''
    1.注册
    2.登录
    3.上传
    4.下载'''
    go = {'1':register,'2':login,'3':upload,'4':download}
    while True:
        print(msg)
        choice = input('请输入功能,q退出')
        if choice == 'q':
            break
        if choice not in go:
            continue
        go.get(choice)()
run()

db_handler

from  conf import setting
import os
import json
def save(username,dic):
    path = os.path.join(setting.DB_PATH,f'{username}.json')
    with open(path,'w',encoding='utf8') as f:
        json.dump(dic,f)

def read(username):
    path = os.path.join(setting.DB_PATH,f'{username}.json')
    if not os.path.exists(path):
        return False
    else:
        with open(path,'r',encoding='utf8') as f:
            data = json.load(f)
            return data

原文地址:https://www.cnblogs.com/oxtime/p/11494525.html

时间: 2024-07-30 18:33:58

进阶版socket套接字ftp文件传输可并发的相关文章

linux网络编程-(socket套接字编程UDP传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程

基于UDP协议 的socket套接字编程 1.UDP套接字简单示例 1.1服务端 import socket server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 建立一个UDP协议的服务器 server.bind(("127.0.0.1",8080)) while True: data,addr = server.recvfrom(1024) server.sendto(data.upper(),addr) server

linux网络环境下socket套接字编程(UDP文件传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

Socket(套接字) IP TCP UDP HTTP

Socket(套接字) (转)什么是套接字(Socket)? 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)(socket是操作系统提供出来的接口)的接口,区分不同应用程序进程间的网络通信和连接.生成套接字,主要有3个参数:通信的目的IP地址.使用的传输 层

Linux之socket套接字编程20160704

介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的 区别,我觉得这是没有从本质上弄清楚网络通信! TCP/IP协议是一个协议簇.里面包括很多协议的.UDP只是其中的一个.之所以命名为TCP/IP协议,因为TCP,IP协议是 两个很重要的协议,就用他两命名了. TCP/IP协议集包括应用层,传输层,网络层,网络访问层. 其中应用层包括: 超文

Linux 套接字与文件描述符

端口和套接字,用于确定指定主机上的哪个本地进程使用了哪个协议和哪台远程主机上的哪个进程进行了通信.端口和套接字的使用可以基于以下几点: ①为每个应用过程分配一个过程标识符(Process ID),每次启动一个进程时,这个ID都可能是不同的. ②进程ID因操作系统平台不同而不同,因而它们是不统一的. ③一个服务器过程能够同时与多个客户连接,因而简单的连接标识符不可能是唯一的. 端口和套接字概念提供了一种以统一的方式唯一地标识连接以及参与连接的程序和主机的方法,而不管特定的过程ID. (1)端口 

19、网络编程 (Socket套接字编程)

网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用层.传输层.网络层和链路层,每层分别负责不同的通信功能,接下来针对这四层进行详细地讲解. 链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤.网线提供的驱动. 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络. 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议. 应用层:主要负责应用程序的协议,例如

python之socket(套接字)

一.客户端/服务器架构 1.1基本概念 客户端/服务器架构即:C/S架构,包括: (1)硬件C/S架构(打印机) (2)软件C/S架构(Web服务器) 1.2举例 生活中的C/S架构:饭店为S端,所有食客C端 二.TCP/udp/osi七层 2.1TCP/UDP协议 TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用TCP的应用:Web浏览器:电子邮件.文件传输程序. UDP(U

socket套接字编程

socket套接字编程 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频,你得下个腾讯视频客户端才能看它的视频) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发         详见网络通信原理   socket是什么 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Soc