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 外部访问它
我目前正在游戏服务器上进行一个简单的学校项目。我在处理 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