Python Socket Programming Server 和多个客户端存储数据失败

Python Socket Programming Server and multiple clients failure of storing data

我目前正在游戏服务器上进行一个简单的学校项目。我在处理 TCP 服务器中修改后的数据时遇到了一个概念性问题。

我已经为这些问题创建了一个简单的程序。客户端将首先键入一个数字,然后该数字将发送到服务器。该号码将在服务器中通过加 1 进行处理,服务器会将修改后的号码发送回客户端。另外,修改后的号码也会保存到totalNum中,存放所有客户修改号码的总和。

我希望服务器会“存储”客户号码。例如,当客户端 A 发送数字 5 时,totalNum 将是 6。之后,当客户端 B 发送数字 8 时,客户端 A 数据仍应保留在服务器中,我希望 totalNum 是6+9 = 15.

Server.py

#!/usr/bin/python3

import socket
import threading

class ServerThread(threading.Thread):
    def __init__(self, client):
        threading.Thread.__init__(self)
        self.client = client

    def run(self):
        connectionSocket, addr = self.client    

        totalNum = 0

        number = connectionSocket.recv(1024)
        newNumber = number.decode()
        newNumber = int(newNumber)
        editedNumber = newNumber + 1
        #add the edited number to the totalNum in the server
        totalNum = editedNumber + totalNum
        print (totalNum)
        #change back to str for sending
        editedNumber = str(editedNumber)
        connectionSocket.send(editedNumber.encode())
        connectionSocket.close()

class ServerMain:
    def server_run(self):  
        serverPort = 12000
        serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        serverSocket.bind( ("", serverPort) )
        serverSocket.listen(5)
        print("The server is ready to receive")
        while True:
            client = serverSocket.accept()
            t = ServerThread(client)
            t.start()

if __name__ == '__main__':
    server = ServerMain()
    server.server_run()

Client.py

#!/usr/bin/python3

import socket

clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

serverName = "localhost"

serverPort = 12000

clientSocket.connect( (serverName, serverPort) )

# Get input for sending
number = input("Input a number:")

clientSocket.send(number.encode())

modifiednumber = clientSocket.recv(1024)

print("From Server:", modifiednumber.decode())

clientSocket.close()

更新服务器代码(将 totalNum 变量更改为 class 变量):

#!/usr/bin/python3

import socket
import threading

class ServerThread(threading.Thread):
    totalNum = 0
    def __init__(self, client):
        threading.Thread.__init__(self)
        self.client = client

    def run(self):
        connectionSocket, addr = self.client   

        number = connectionSocket.recv(1024)
        newNumber = number.decode()
        newNumber = int(newNumber)
        editedNumber = newNumber + 1
        #add the edited number to the totalNum in the server
        self.totalNum = editedNumber + self.totalNum
        print (self.totalNum)
        #change back to str for sending
        editedNumber = str(editedNumber)
        connectionSocket.send(editedNumber.encode())
        connectionSocket.close()

class ServerMain:
    def server_run(self):  
        serverPort = 12000
        serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        serverSocket.bind( ("", serverPort) )
        serverSocket.listen(5)
        print("The server is ready to receive")
        while True:
            client = serverSocket.accept()
            t = ServerThread(client)
            t.start()

if __name__ == '__main__':
    server = ServerMain()
    server.server_run()

你很接近。移动 totalNum = 0 成为 class 级变量,即

class ServerThread(threading.Thread):
    totalNum = 0
    def __init__(self, client):

以及任何使用 totalNum 的地方都将其用作 ServerThread.totalNum

问题是您将 totalNum 作为范围变量,因此每次完成后它都会丢失 run()。如果我们将 totalNum 设为实例变量,就会出现问题。当 run() 结束时,线程结束并且值再次丢失!通过使它成为一个 class 变量,它始终存在并始终共享。您还可以使用 ServerThread.totalNum

从 class 外部访问它