ajflj
ajflj

Reputation: 135

Python Socket Server Can Only Handle 1 Client at a time

I am trying to make a server-client program using threads to handle each client, but the server will only accept one client at a time. If the first client disconnects, then the second client is accepted. Furthermore, each client can only send data once, then the program fails to send any more.

Prior to posting, I have looked at MANY other Stack Overflow posts, including the following:

how can I make a server communicate with more than 1 client at the same time?

python multithreaded server

My Python socket server can only receive one message from the client

But through looking at these posts I have found no solution.

Here is the server code:

import socket
from threading import *


def main():

    s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('172.20.3.62', 5000))
    s.listen(1)
    clients = []
    print("listening")

    def clienthandler(c):
        clients.append(c)
        try:
            while True:
                data = c.recv(1024).decode("UTF-8")
                if not data:
                    break
                else:
                    print(data)
                    for client in clients:
                        client.send(data.encode("UTF-8"))
        except:
            clients.remove(c)
            c.close()

    while True:
        c, addr = s.accept()
        print("accepted a client")
        Thread(target=clienthandler(c)).start()

if __name__ == '__main__':
    main()

Here is the client code:

import socket
from threading import *


def main():
    s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('172.20.3.62', 5000))
    print("connected")
    def send():
        msg = input("ENTER:")
        s.send(msg.encode("UTF-8"))

    def receive():
        while True:
            data = s.recv(1024).decode("UTF-8")
            if data:
                print(data)
            else:
                break

    Thread(target=send).start()
    Thread(target=receive).start()

if __name__ == '__main__':
    main()

Upvotes: 1

Views: 986

Answers (1)

ajflj
ajflj

Reputation: 135

Thanks to user Rawing. His/Her solution was: Thread(target=clien‌​thandler(c)) -> Thread(target=clien‌​thandler, args=(c,)) This allowed for more than one thread, and I was able to solve the only one message problem by putting the client send block in a while loop.

Upvotes: 1

Related Questions