简体   繁体   中英

Why does the client receives wrong information - sockets Python

I am trying to write a small client-server application in Python. The server must generate a random number and send it to the client. The client checks if the number it received is prime. In that case it will send to the server the message "YES". If the number is not prime it will send a "NO" message to the server. Then the server checks the reply and if it is "YES"/"NO", it will send the client the message "CORRECT"/"WRONG" and the client will display it. The app works fine for one client, but when multiple clients are accessing the app at the same time I get errors like this: "invalid literal for int() with base 10: 'Wrong'" and sometimes I get "An existing connection was forcibly closed by the remote host". Can you please tell me what am I doing wrong?

server.py:

import socket
import random
import threading

class ClientHandler(threading.Thread):
    def __init__(self, client_sock, client_addr):
        self.client_sock = client_sock
        self.client_addr = client_addr
        super(ClientHandler, self).__init__()

    def run(self):
        n = random.randint(0, 9)
        trimite = str(n)
        self.client_sock.send(bytes(trimite, "utf-8"))

        received = None
        while received == None:
            received = client_sock.recv(100)

        received = received.decode("utf-8")

        if received == "YES":
             client_sock.send(b"Correct")
        else:
             client_sock.send(b"Wrong")

        self.client_sock.close()

if __name__ == '__main__':
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(("0.0.0.0", 9999))
    sock.listen(10)

    while True:
        client_sock, client_addr = sock.accept()
        print(f"Connected {client_addr[0]} : {client_addr[1]}")
        worker_thread = ClientHandler(client_sock, client_addr)
        worker_thread.start()

client.py:

import socket
import threading


def check_prime(n):

    n = int(n)

    if n == 1 or n == 0:
        return False
    if n == 2:
        return  True
    for i in range(2, n // 2):
        if n % i == 0:
            return False
    return True

class RunMultiple(threading.Thread):
    def __init__(self, sock):
        self.sock = sock
        super(RunMultiple, self).__init__()

    def run(self):

        recieved = self.sock.recv(100)
        if check_prime(recieved.decode("utf-8")) == True:
            self.sock.send(b"YES")
        else:
            self.sock.send(b"NO")

        second_recieved = self.sock.recv(100)
        print(second_recieved.decode("utf 8"))

if __name__ == "__main__":
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    sock.connect(("127.0.0.1", 9999))
    i = 0
    while i != 3:
        worker_thread = RunMultiple(sock)
        worker_thread.start()
        i += 1

Open a new connection for each client:

if __name__ == "__main__":
    for i in range(3):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.connect(("127.0.0.1", 9999))
        worker_thread = RunMultiple(sock)
        worker_thread.start()

And make sure to use self.client_sock not client_sock in the server. Without it, it was referencing the global variable defined in the if __name__ section of the code which is the last socket opened.

        received = None
        while received == None:
            received = self.client_sock.recv(100) # was missing self here

        received = received.decode("utf-8")

        if received == "YES":
             self.client_sock.send(b"Correct") # and here
        else:
             self.client_sock.send(b"Wrong")   # and here

        self.client_sock.close()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM