从多个客户端保存数据到一个文件的问题。TCP Python

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从多个客户端保存数据到一个文件的问题。TCP Python相关的知识,希望对你有一定的参考价值。

我的主要目标是接收多个客户端的数据到服务器上的一个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' 因为你想追加到文件中,而不是截断它。

其次,你有一个竞赛条件,正如评论者所说,你应该使用类似锁的东西来同步访问。 否则数据迟早会丢失。

以上是关于从多个客户端保存数据到一个文件的问题。TCP Python的主要内容,如果未能解决你的问题,请参考以下文章

Java TCP 网络通信编程

如何更改服务器以便多个客户端可以访问服务器中的共享数据?

js如何保存文件

多个并行tcp连接

如何在 Django 中压缩多个上传的文件,然后再将其保存到数据库?

Socket 服务器数据接收混乱