我目前正在游戲服務器上進行一個簡單的學校專案。我有一個處理 TCPserver 中修改資料的概念性問題。
我為這些問題創建了一個簡單的程式。客戶端將首先鍵入一個數字,然后該數字將發送到服務器。該數字將在服務器中通過加 1 進行處理,服務器會將修改后的數字發送回客戶端。此外,修改后的號碼也會保存到 中totalNum,其中存盤了所有客戶修改號碼的總和。
我希望服務器會“存盤”客戶端編號。例如,當客戶端 A 發送數字 5 時,totalNum將是 6。之后,當客戶端 B 發送數字 8 時,客戶端 A 的資料仍應保留在服務器中,我預計totalNum為 6 9 = 15。
服務器.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()
客戶端.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()
更新的服務器代碼(更改totalNumto 類變數):
#!/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()
uj5u.com熱心網友回復:
你很接近。移動totalNum = 0為類級別變數,即
class ServerThread(threading.Thread):
totalNum = 0
def __init__(self, client):
以及您totalNum使用它的任何地方ServerThread.totalNum
問題是您將 totalNum 作為范圍變數,因此每次完成時它都會丟失run()。如果我們創建了totalNum一個實體變數,就會出現問題。當run()結束時執行緒結束并且值再次丟失!通過使它成為一個類變數,它總是在那里并且總是共享的。你也可以從課外訪問它ServerThread.totalNum
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/351275.html
