python - 将来自多个客户端的数据保存到一个文件时出现问题。TCP 蟒蛇
问题描述
我的主要目标是将来自多个客户端的数据接收到我服务器上的一个 txt 文件中。一切正常,客户端连接到服务器,服务器识别出它们是不同的客户端,此外,它们正在向服务器发送数据(并保存到 data_r.txt 文件中),但是,它们正在覆盖文件。所以我只从最后一个发送数据的客户端获取数据。所有客户端的文件名必须相同。我不知道该怎么做以及如何解决它。
服务器 TCP
import socket
from threading import Thread
from socketserver import ThreadingMixIn
from threading import Thread
from socketserver import ThreadingMixIn
HOST = '192.168.0.108'
TCP_PORT = 60001
BUFFER_SIZE = 1024
class ClientThread(Thread):
def __init__(self, ip, port, sock):
Thread.__init__(self)
self.ip = ip
self.port = port
self.sock = sock
def run(self):
filename = 'data_r.txt'
f = open(filename, 'wb')
while True:
data = self.sock.recv(1024)
if not data:
f.close()
#self.sock.close()
break
f.write(data)
self.sock.sendall("File received")
self.sock.close()
tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Creating socket...')
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print('Socket created successfully')
print('Binding socket to the port...')
tcpsock.bind((HOST, TCP_PORT))
print(f'Socket binded successfully to port {TCP_PORT} ')
print('Waiting for clients to join....')
threads = []
while True:
tcpsock.listen(5)
(conn, (ip, port)) = tcpsock.accept()
#conn.settimeout(7)
newthread = ClientThread(ip, port, conn)
print(newthread)
newthread.start()
threads.append(newthread)
for t in threads:
t.join()
TCP 客户端
import socket
# TCP_IP = 'localhost'
HOST = '192.168.0.108'
TCP_PORT = 60001
BUFFER_SIZE = 1024
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Connecting to socket')
socket.connect((HOST, TCP_PORT))
print(f'Connected to host: {HOST} on port: {TCP_PORT}')
print('')
filename='data_s.txt'
f = open(filename, 'rb')
while True:
chunk = f.read(BUFFER_SIZE)
if not chunk:
print ("File transfer completed")
f.close()
break
socket.send(chunk)
c = socket.recv(BUFFER_SIZE)
print (c)
socket.close()
print('connection closed')
解决方案
要更正的第一件事是使用open(filename, 'ab')
而不是'wb'
因为您想附加到文件,而不是截断它。
其次,你有一个竞争条件,正如评论者所说,你应该使用锁之类的东西来同步访问。否则数据迟早会丢失。
推荐阅读
- activemq-artemis - ActiveMQ Artemis 传输方案无法识别 [vm] 错误
- javascript - elementByAccessibilityId - 不适用于最新的本机反应
- vba - 如何在texbox中显示选定的列表框文本?字 2016 VB
- .net-core - 如何返回带有显式标头的 StatusCode?
- javascript - 将参数添加到 $.getScript
- java - 在 Multimap 内循环 Multimap
- c - 如何在不更改构建系统的情况下在 C 项目中使用 rust 代码?
- java - Angular 8 从 HttpResponse 获取“Set-Cookie”标头
- hadoop - ORC 文件转储中的条带大小是否以压缩大小格式表示?
- c# - 与 Visual Studio 2019 交叉编译