博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个简单的python文件传输服务器
阅读量:5730 次
发布时间:2019-06-18

本文共 2142 字,大约阅读时间需要 7 分钟。

hot3.png

服务器 代码,可以兼容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") #退出服务器

 

 

转载于:https://my.oschina.net/u/4000302/blog/2963033

你可能感兴趣的文章
你的GitHub,怎么和我用的不太一样?
查看>>
WeZRender:微信小程序Canvas增强组件。
查看>>
获取RSS源xml文件的四种方法
查看>>
前端学习资源
查看>>
golang 对自定义类型排序
查看>>
时隔25年重访 Linus:流量时代的“技术大师”
查看>>
SQL Server 2016:伸展数据库
查看>>
Mozilla开发全新的公开网络API WebXR 来实现增强现实
查看>>
Medusa:比CPython更快的Python实现
查看>>
Docker宣布企业版支持Windows Server 2019
查看>>
.NET Core 2.0 Preview 2为开发人员带来改进
查看>>
如何理解“Unix里一切都是文件”这句话?
查看>>
七牛李倩:⼯程效率如何为研发赋能
查看>>
微软宣布Azure Functions正式支持Java
查看>>
实战SpringMVC+Mybatis搭建高性能安全站点
查看>>
Minikube在Mac上搭建PHP容器集群
查看>>
作为前端开发,如何写好一个简历
查看>>
常用的ES6
查看>>
可应用于实际的14个NLP突破性研究成果(三)
查看>>
ASM卷加盘
查看>>