Home > Enterprise >  Python Socket Programming Server and multiple clients failure of storing data
Python Socket Programming Server and multiple clients failure of storing data

Time:11-05

I am currently working on a simple school project on game server. I have one conceptual problem for dealing with the modified data in the TCPserver.

I have created a simple program for the issues. The clients will first type a number and the number will send to the server. This number will be processed in the server by adding 1 and the server will send the modified number back to clients. In addition, the modified number will also save to the totalNum, which store all the sum of clients modified number.

I expect the server will "store" the clients number. For instance, when client A send number 5, the totalNum would be 6. After that, when client B send number 8, client A data should still maintain in the sever, I expect the totalNum to be 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()

updated server code(changing the totalNum to class variable):

#!/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()

CodePudding user response:

Youre pretty close. move totalNum = 0 to be a class level variable, i.e.

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

and anywhere you use totalNum use it as ServerThread.totalNum

The problem was that you had totalNum as a scoped variable so it would get lost every time you finished run(). the issue arises if we made totalNum an instance variable. when run() ends the thread ends and the value gets lost again! by making it a class variable its always there and always shared. you can also access it from outside the class with ServerThread.totalNum

  • Related