gpt4 book ai didi

python - 在 Python 3 中使用套接字传输文件

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:55 24 4
gpt4 key购买 nike

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

服务器代码:

    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 文件

最佳答案

你可以大大改进你的循环。

  1. 使用 while True 而不是 while 1。当然它可以工作并且需要更少的打字,但是如果你真的想要更少的打字那么你应该使用 Perl。 while True 非常简单,几乎任何人都可以猜出其含义 - while 1 只是 Python 没有 True 时的保留>错误
  2. 当没有更多内容可供读取时,
  3. socket.recv 返回一个空字符串。使用它。
  4. 每次循环都会打开文件。每次循环都会截断它。

以下是更好的方法:

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,并且循环将退出。

关于python - 在 Python 3 中使用套接字传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38580012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com