文档章节

一个简单的python文件传输服务器

shzwork
 shzwork
发布于 2018/11/29 14:55
字数 379
阅读 237
收藏 2

服务器 代码,可以兼容python2 和 python3

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import socket, AF_INET, SOCK_STREAM

class SimpleServer:
    def startServer(self,port):
        tcpSerSock=socket(AF_INET,SOCK_STREAM)
        tcpSerSock.bind(("",port))
        tcpSerSock.listen(5)
        while True:
            try:
                print("server start! waiting connect...")
                tcpCliSock,addr =tcpSerSock.accept()
                print("from client " + addr[0])
                while True:
                    filename_len = tcpCliSock.recv(1)
                    if not filename_len:
                        break
                    try:
                        filename_len = int(str(filename_len)) #python2
                    except:
                        filename_len = int(filename_len.decode()) #python3
                    filename = tcpCliSock.recv(filename_len).decode("utf8")
                    if(filename == "quit"):
                        tcpCliSock.close()
                        tcpSerSock.close()
                        return
                    with open(filename, 'wb') as f:
                        while True:
                            buf = tcpCliSock.recv(4096)
                            if not buf:
                                break
                            else:
                                f.write(buf)
                    print("recv ["+filename+"] ok!")
                    break
            except:
                pass
            finally:
                tcpCliSock.close()
        tcpSerSock.close()

if __name__ == '__main__':
    print("start server!")
    s = SimpleServer()
    s.startServer(1234)
    print("end server!")

 

==============================================================

客户端 只在python3下试过  python应该是不行的

 

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 发送格式为 1字节的"文件名长度"+"文件名"+"二进制数据" 
# 如果文件名是 quit 那就退出

import os
from socket import socket, AF_INET, SOCK_STREAM

target = ('127.0.0.1',1234)

class SimpleClient:
    
    def setHost(self, host, port):
        self.host = host
        self.port = port
        
    def __get_header (self,filename):
            leng = len(filename) #文件名长度
            assert leng<250
            return str(leng) + filename #头部 就是 “1字节的长度”+“文件名”
     
    def send(self,filepath):
            #生成文件头
            filename = os.path.basename(filepath)
            header = self.__get_header(filename)
            s = socket(AF_INET, SOCK_STREAM)
            s.connect(target)
            s.send((header).encode()) #先发送头部
            if(filepath == "quit"):
                print("close server over!!!")
                pass
            else:
                with open(filepath, 'rb') as f: #读取数据发送
                    while True:
                        buf = f.read(4096)
                        if (len(buf)>0):
                            s.send(buf)
                        else:
                            break
                print("send over!!!")
#            result = s.recv(256).decode()
#            print("result:"+result)
            s.close()

if __name__ == '__main__':
    c = SimpleClient()
    c.setHost("127.0.0.1", 1234)
    c.send("D:/testpy/data/a.jpg") # 发送文件
#    c.send("quit") #退出服务器

 

 

© 著作权归作者所有

shzwork

shzwork

粉丝 15
博文 858
码字总数 18401
作品 0
厦门
私信 提问
使用 cURL 和 libcurl 通过 Internet 进行对话

cURL 是一个命令行工具,可以对文件传输使用许多协议,包括 HTTP、FTP、Secure Copy (SCP)、Telnet 等等。但是,除了可以用命令行通过 Internet 与端点对话外,还可以使用 libcurl 编写简单或...

红薯
2009/11/02
1K
0
通过python模块实现服务器和本地机器之间快速拷贝文件

在实际的开发过程中,很多时候我们都不直接在本机上开发,一般都在远程服务器上开发并运行程序。 比如三胖在实际开发中就会使用到很多台服务器:我有一台笔记本电脑,通过 ssh 连接着很多台服...

blackfoxya
2018/07/30
292
0
Python 网络编程socket_server单线程响应请求

说明:刚开始接触python网络编程,使用socket编写一个简单的单线程server。socket模块提供了一个工厂函数,也被称为socket,开发者可以调用函数以生成一个套接字对象S。要想执行网络层操作,...

0101
2012/12/05
499
2
Python3基础之学习笔记(八)-socket网络编程-paramiko模块

1. socket网络编程 1.1 socket简介 Python 提供了两个级别访问的网络服务。: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方...

GoldenKitten
01/15
0
0
python模块介绍-shadowsocks:穿越防火墙的快速隧道代理(实现自由冲浪)

Shadowsocks 是一个安全的socks5代理,用于保护网络流量,是一个开源项目。 由于Shadowsocks使用socks5协议和可自定义密码的工业级算法加密,使得流量在网络传输过程中不易被他人读取。但是使...

磁针石
2015/06/09
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 8 Stream Api 中的 skip 和 limit 操作

1. 前言 Java 8 Stream API 中的skip()和limit()方法具有类似的作用。它们都是对流进行裁剪的中间方法。今天我们来探讨一下这两个方法。 2. skip() skip(lang n) 是一个跳过前 n 个元素的...

码农小胖哥
35分钟前
1
0
看中华小当家第二集片段记录

最近正好在学习做饭,看看这片子,燃烧燃烧做饭的热情 哈哈,以下是摘的一些句子和个人理解 My name is Liu Mao Xing . More commonly known as Mao. 个人理解:我的名字叫 刘昴星, (commo...

T型人才追梦者
40分钟前
3
0
Python基础-6

1、注释 # 单行注释'''多行注释'''"""多行注释"""# 中文编码声明注释 ,在文件开头加上下面这行注释# encoding=utf-8或者# -*- encoding:utf-8 -*- (-*- 只是为了美观,没有实际......

zfskkk
40分钟前
5
0
我的这半年 / 2018 七夕著

浑然不觉,竟已至七夕, 今年已经过了一半 , 突然想给自己记录点什么 , 回顾下我的2018, 我的这上半年. 2018的第一件记事得从一月份下旬的那场大雪说起 , 一觉醒来 , 窗外整个银装素裹 , 在此之...

gxLong
45分钟前
3
0
NSS支持的数据库

NSS,简写自Name Service Switch。我把它译为“名字服务中心”。 在*nix操作系统中,NSS是C语言库(Library C或者glibc)的一部分,用以寻找名字。比如说,我们运行ls -lh查看一个目录中的文...

大别阿郎
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部