1

我有以下客户端-服务器套接字应用程序可以将文件上传到服务器。

服务器代码:

    import socket,sys,SocketServer

   class EchoRequestHandler(SocketServer.BaseRequestHandler):
       def setup(self):
           print self.client_address, 'connected!'
           self.request.send('hi ' + str(self.client_address) + '\n')

       def handle(self):
           while 1:
                  myfile = open('test.txt', 'w')
                  data = self.request.recv(1024)
                  myfile.write(data)
                  print 'writing file ....'
                  myfile.close()

       def finish(self):
          print self.client_address, 'disconnected!'
          self.request.send('bye ' + str(self.client_address) + '\n')

  if __name__=='__main__':
          server = SocketServer.ThreadingTCPServer(('localhost', 50000), EchoRequestHandler)
          server.serve_forever()

客户端代码:

import socket
import sys 

HOST, PORT = "localhost", 50000

# Create a socket (SOCK_STREAM means a TCP socket)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    # Connect to server and send data
    sock.connect((HOST, PORT))

    # Receive data from the server and shut down
    received = sock.recv(1024)

    date = open('file_t.txt').read()
    sock.sendall(data + "\n")
finally:
    sock.close()

print "Sent:     {}".format(data)
print "Received: {}".format(received)

但是在服务器端,控制台输出是不停的“写入文件......”,最后文件没有被存储,它是一个空的 test.txt 文件

4

1 回答 1

1

你可以改进你的循环相当多。

  1. 使用while True而不是while 1. 当然它可以工作并且输入更少,但是如果你真的想要更少的输入,那么你应该使用 Perl。while True很容易,几乎任何人都可以猜到它的含义——while 1只是 Python 没有TrueFalse
  2. socket.recv当没有更多内容可读取时,返回一个空字符串。用那个。
  3. 您每次通过循环打开文件。每次通过循环都会截断它。

以下是更好的方法:

def handle(self):
    # With block handles closing - even on exceptions!
    with open('test.txt', 'w') as outfile:
        data = 'fnord' # just something to be there for the first comparison
        while data:
            data = self.request.recv(1024)
            print('writing {!r} to file ....'.format(data))
            outfile.write(data)

这种方法不需要中断 - 因为它while True不是while data. 只要字符串不为空,字符串就会评估为True,因此只要有要写入的数据,它就会继续写入数据。最终,发送方将停止发送任何数据,套接字将关闭并且数据将是一个空字符串,其计算结果为 False,并且您的循环将退出。

于 2016-07-26T02:20:43.173 回答