一個簡單的python文件傳輸服務器 原

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章