解码不正常,而循环没有正确断开python

时间:2015-09-23 04:27:34

标签: python sockets tcp

这是一个在Python中使用TCP套接字的文件传输应用程序。文件传输协议将包括一个名为ftps.py的服务器和一个名为ftpc.py的客户端。

文件传输应用程序将使用简单的协议。前4个字节(按网络字节顺序)将包含要遵循的文件中的字节数。接下来的20个字节将包含文件的名称(假设名称适合20个字节)。要跟随的TCP流中的其余字节将包含文件中的数据。

我在不同的机器上运行客户端程序和服务器程序,但我有两个错误: 1)当我编码文件名并将其发送到套接字时,当服务器端接收并解码它时,文件名不正确

2)服务器端似乎陷入了一段时间,我不知道为什么

客户端

import socket
import sys
import os

filename=sys.argv[2]
print filename
if len(sys.argv) > 1 :
    print('Trying to connect...')
    s = socket.socket()
    ip_add=(sys.argv[1])
    print(ip_add)
    s.connect((ip_add, 4000))

    print('Connected. Wating for command.')
    while True:
        cmd = s.recv(24)
        if cmd == 'getsize':
            print('"getsize" command received.')
            statinfo=os.stat(filename)
            byte_size=statinfo.st_size
            size_str=str(byte_size)
            s.sendall(size_str)

        if cmd == 'getfilename':
            print('"getfilename" command received.')
        formatted_name = filename.rjust(20)
        fname = formatted_name.lstrip()
        print(fname)
        encoded_filename=fname.encode('utf-8')
            s.sendall(encoded_filename)

        if cmd == 'getfile':
            print('"getfile" command received. Going to send file.')     
            file_input = open(sys.argv[2], 'rb')
        while True:
        buff = file_input.read(512)
            if len(buff) == 0:
                break
        s.sendall(buff)

            print('File transmission done.')

        if cmd == 'end':
            print('"end" command received. Teminate.')
            break
file_input.close()
f.close()

服务器

import socket
import os
import sys

save_path='recv/'


print('Waiting for clinet to connect...')
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.bind(('', 4000))
c.listen(1)
s, a = c.accept()

print('Connected. Going to receive file.')
s.sendall('getsize')
filesize_str = s.recv(4)
size_bytes=filesize_str.decode()
print(size_bytes)
s.sendall('getfilename')
byte_var = s.recv(20)
filename=byte_var.decode('utf-8')

output = os.path.join(save_path, filename)
f = open(output, 'wb')

print('Filename: ' + filename)

while True:
    s.sendall('getfile')
    while True:
        data = s.recv(512)
        if not data: 
            break
        f.write(data)
        break
s.sendall('end')
print('File received.')

s.close()
c.close()
f.close()

以下是服务器程序的终端输出:

% python ftps.py
Waiting for clinet to connect...
Connected. Going to receive file.
1797
Filename: 55

客户端输出:

% python ftpc.py 164.107.113.20 2.jpg
2.jpg
Trying to connect...
164.107.113.20
Connected. Wating for command.
"getsize" command received.
"getfilename" command received.
2.jpg
"getfile" command received. Going to send file.
File transmission done.

文件名:55,它应该是Filename:2.jpg 此时程序陷入循环中..任何人都知道为什么会发生这种情况?

0 个答案:

没有答案