简体   繁体   中英

Threaded python socket server

I have a Multihtreaded Server with python that can handle clients request, but i have a problem with this. In my Server Class I have a start function that start listening to clients like this:

class Server:
    def __init__(self, clients={}):
        self.clients = clients
        self.ip = 'localhost'
        self.port = ****
        self.pattern = '(C\d)'


def start(self):
    self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.s.bind((self.ip, self.port))
    self.s.listen(10)
    while 1:
        clientsock, addr = self.s.accept()
        print ('Connected with ' + addr[0] + ':' + str(addr[1]))
        _thread.start_new_thread(self.handler, (clientsock, addr))
def handler(self, clientsock, addr):
    data = clientsock.recv(BUFF)
    print ('Data : ' + repr(data))
    data = data.decode("UTF-8")
    result = re.match(self.pattern, data)
    print (data)
    if(result):
        self.registerClient(clientsock, data)
    if(data == "Exit"):
        self.exitClient(clientsock)
def server_response(self, message, flag, err):
    if(flag):
        res = message.encode('utf-8')
        return res
    else:
        res = message.encode('utf-8')+ "[ ".encode('utf-8')+err.encode('utf-8')+ " ]".encode('utf-8')
        return res

def registerClient(self, clientsock, data):
    if(data in self.clients):
        err = "Error : Client Name Exist!"
        clientsock.send(self.server_response('Reg#NOK#', 0, err))
        clientsock.close()
        sys.exit(1)
    self.clients[clientsock] = data
    clientsock.send(self.server_response('Reg#OK', 1, ''))
def exitClient(self, clientsock):
    try:
        f = self.clients.pop(clientsock)
        clientsock.send(self.server_response('BYE#OK', 1, ''))
        clientsock.close() 
    except KeyError:
        err = "Error : Client Doesn't Connected To Server!"
        clientsock.send(self.server_response('BYE#NOK#', 0, err))
        clientsock.close()
        sys.exit(1)

And this is my client Class :

class Client:
    def __init__(self, name):
        self.name = name
        self.ip = '127.0.0.1'
        self.next_client = None
        self.s = ""
        try:
            self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        except:
            print ('Reg#NOK#[ ' + msg[1] + ' ]')
            sys.exit()
def register(self, server):
    self.s.connect((server.ip, server.port))
    message = self.name
    try:
        self.s.sendall(bytes(message, 'UTF-8'))
    except (socket.error):
        print ('Send Failed')
        sys.exit()

    reply = self.s.recv(4096)
    print ("Respose From Server : " + reply.decode("utf-8") )
def exitFromServer(self, server):
    message = "Exit".encode('utf-8')
    try:
        a = self.s.sendall(message)
    except (socket.error):
        print ('Send Failed')
        sys.exit()

    reply = self.s.recv(4096)

And this is the main file:

from server import *
from client import *
import _thread

a = Server()
_thread.start_new_thread(a.start, ())
b = Client("C1")
b.register(a)
b.exitFromServer(a)

As you can see when start function from Server class called there is no thread that can handle create Client , I mean when I use start function like this with out thread there is no way that program can go ahead in main file , I know I should use another thread here but where and how, I use Python 3.4 , Thanks for helping me.

Edit

the Problem with start was Solved , Thanks from tdelaney, but when I run this only the register function works and exitFromServer dont do anything can you tell me where is the problem.the program dosent do anything after execute register function and it seems that its wating for something.

This mean?

import threading
from server import *
from client import *

global a
a = Server()
def sServer():
    global a
    a.start()

def cClient():
    global a
    b = Client("C1")
    b.register(a)


s = threading.Thread(name='server', target=sServer)
c = threading.Thread(name='client', target=cClient)

s.start()
c.start()

In Server Class I must add another while True loop after handler function cause it shuould do all client request till client has request:

def handler(self, clientsock, addr):
    while 1:
        data = clientsock.recv(BUFF)
        print ('Data : ' + repr(data))
        data = data.decode("UTF-8")
        result = re.match(self.pattern, data)
        if(result):
            self.registerClient(clientsock, data)
        if(data == "Exit"):
            self.exitClient(clientsock)
            break

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