简单的服务器文件程序,文件始终不存在

时间:2018-04-15 11:37:46

标签: python

我最近尝试了一个关于如何使用python创建一个简单文件服务器程序的教程。我不知道为什么每次我检查文件是否存在,它总是告诉我文件不存在,这里是代码

# server.py

import socket
import threading
import os


def RetFile(FileName, sock):
    FileName = sock.recv(1024)
    exists = os.path.isfile(FileName)
    if exists:
        sock.send(str.encode("EXISTS " + str(os.path.getsize(FileName))))
        UserResponce = sock.recv(1024)
        if UserResponce[:2] == "OK":
            with open(FileName, 'rb') as f:
                bytesToSend = f.read(1024)
                sock.send(bytesToSend)
                while bytesToSend != "":
                    bytesToSend = f.read(1024)
                    sock.send(bytesToSend)
    else:
        sock.send(str.encode("ERR"))
        sock.close()


def Main():
    host = '127.0.0.1'
    port = 5001

    s = socket.socket()
    s.bind((host, port))
    s.listen(5)

    print('Server Started')
    while True:
        conn, addr = s.accept()
        print('Client Connected -> ', str(addr))

        t = threading.Thread(target=RetFile, args=("retrThread", conn))
        t.start()


if __name__ == '__main__':
    Main()
# client.py

import socket


def Main():
    host = '127.0.0.1'
    port = 5001

    s = socket.socket()
    s.connect((host, port))
    filename = input('File Name -> ')
    if filename != 'q':
        s.send(str.encode(filename))
        data = s.recv(1024)
        if data[:6] == "EXISTS ":
            filesize = float(data[6:])
            message = input('File Exists: ' + str(filesize) + ' Bytes, Download? (Y/N) -> ')
            if message == 'Y':
                s.send(str.encode("OK"))
                f = open('new_' + filename, 'wb')
                data = s.recv(1024)
                totalRecv = len(data)
                f.write(data)
                while totalRecv < filesize:
                    data = s.recv(1024)
                    totalRecv += len(data)
                    f.write(data)
                    print("{0:.2f}".format((totalRecv / float(filesize)) * 100) + "% Done!")
                print('Download Complete')
        else:
            print("File Doesn't Exist")
    s.close()


if __name__ == '__main__':
    Main()

那么代码的错误在哪里?教程使用python 2.x,我使用3.x所以我有一些小的改动,我是这种语言的新手,所以任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:1)

除了文件可能不存在之外,还有一个明显的问题:

if data[:6] == "EXISTS ":

永远不会是True,因为data[:6]是一个包含6个字符的字符串,"EXISTS "是7个字符长。

答案 1 :(得分:1)

您的代码中存在一些主要与字节转换有关的问题。如果你使用python 3或更高版本,你不能在套接字接口上发送字符串,使用python 2它可以正常工作。因此,在发送套接字之前,必须将每条消息更改为字节,我已修复所有此类问题。下载工作正常

已修复服务器

# server.py

import socket
import threading
import os

def RetrFile(name, sock):
    filename = sock.recv(1024)
    if os.path.isfile(filename):
        sock.send(b"Exist " + str(os.path.getsize(filename)).encode())
        userResponse = sock.recv(1024)
        if userResponse.decode() == 'OK':
            with open(filename, 'rb') as f:
                bytesToSend = f.read(1024)
                while bytesToSend.decode() != "":
                    sock.send(bytesToSend)
                    bytesToSend = f.read(1024)

    else:
        sock.send(b"ERR")
    sock.close()

def Main():
    host = '127.0.0.1'
    port = 5000

    s = socket.socket()
    s.bind((host, port))

    s.listen(5)

    print("server started.")

    while True:
        c, addr = s.accept()
        print("client connected ip:<" + str(addr) + ">")
        t = threading.Thread(target=RetrFile, args=("retrThread", c))
        t.start()


if __name__ == '__main__':
    Main()

固定客户端

# client.py

import socket

def Main():
    host = '127.0.0.1'
    port = 5000

    s = socket.socket()
    s.connect((host, port))

    filename = bytearray(input("filename.. ").encode())
    if filename != 'q':
        s.send(filename)
        data = s.recv(1024)

        if data[:6].decode().rstrip().upper() == 'EXIST':
            filesize = data[6:].decode().rstrip()
            message = input("File exists, " + filesize+ "Bytes, download..? (Y/N)")
            if message.upper() == 'Y':
                totalRecv = 0
                s.send(b'OK')
                f = open('new_' + filename.decode(), 'wb')
                data = s.recv(1024)
                while data.decode() != "":
                    totalRecv += len(data)
                    data = s.recv(1024)
                    f.write(data)
                    print("{:2f}".format((totalRecv/float(filesize))*100)+ "Done")
                print("Download complete")
    else:
        print("File doesn't exist")

if __name__ == '__main__':
    Main()