线程服务器以接受多个客户端无法正常工作

时间:2016-04-29 12:39:26

标签: python multithreading networking

好吧,我正在尝试制作一个简单的网络TCP聊天程序,以深入了解python,线程和网络。该程序工作,但只有一个用户,我看了这个,我发现我需要线程,使服务器接受多个用户。我对服务器进行了线程化,但是现在当你连接第二个用户时,它会断开第一个用户源代码可能不太好......

#!/usr/bin/python
import socket, sys, threading
from time import sleep

# Global Stuff
localhost = socket.gethostbyname(socket.gethostname())
#localhost = '192.168.x.x'
serverPort = 5003
buffer = 1024 #Bytes
backlog = 5
userThread= []
count = 0

class server(object):
    ''' Constructor to Establish Bind server once an object made'''
    def __init__(self, localhost, serverPort):  # Connect Tcp
        global backlog, count
        self.servSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            self.servSock.bind((localhost, serverPort))# bind((host,Port))
            self.servSock.listen(backlog)
            print count
        except Exception, e:
            print "[Bind ]", e
            sys.exit()

    def accept(self):
        global userThread, conn, addr, count
        """ 
        - PROBLEM IS IN HERE SOMEWHERE SERVER DOESN'T ADD THE OTHER CLIENT EXCEPT ONCE.
        - THREAD DOEN'T KEEP THE CLIENT.
        - THE SECOND CLIENT FREEZES WHILE SENDING THE VERY FIRST MESSAGE TILL THE FIRST
          CLIENT SEND A MESSAGE THEN IT CAN SEND MESSAGES AND THE FIRST CLIENT CAN'T SEND SHIT.
        """
        count+=1
        while True:
            print count
            self.conn, self.addr = self.servSock.accept()
            conn = self.conn
            print("This is a connection: ", conn)
            #acceptThread = threading.start_new_thread(target=serverObj.accept, args=(conn))

            #addr = self.addr
            print "[Listening..]"
            if(self.addr not in userThread):
                userThread.append(self.addr)
                print "Client's added Successfully"
            else:
                pass

    def redirect(self):
        global buffer, userThread, conn, count
        count+=1
        while True:
            try:
                print "Redirecting " + str(count)
                self.data = conn.recv(buffer)
                if self.data:
                    for user in userThread:
                        #conn.send(b'Recieved by server!\n')
                        conn.sendto("Sent!\n"+self.data+"\n", user)
                        print "Server: Data sent[" +self.data+"] to ["+str(user)+"]" 
                else:
                    self.data = conn.recv(buffer)
                    print "No dataa found"

            except Exception, e:
                print "[Redirect ] ",e
                sleep(7)
        print "OUT"# testing if it's getting out this infinite loop.
    def exit(self):
        self.server.close()
def main():
    global localhost, serverPort, conn
    try:
        serverObj = server(localhost, serverPort)
        print("[+] Server is UP!")
    except Exception, e:
        print "[Main ] ",e
        exit()

    acceptThread = threading.Thread(name = "Accepting Connections", target=serverObj.accept)
    redirThread = threading.Thread(name = "Redirecting Data", target=serverObj.redirect)
    acceptThread.start()
    redirThread.start()
    print userThread

main()

######################################### Client ##########################################
#!/usr/bin/python
# This is client file
"""
http://eli.thegreenplace.net/2011/05/18/code-sample-socket-client-thread-in-python
https://docs.python.org/2/library/threading.html
"""
import socket
import threading
from time import sleep

# Client Info
#clientSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#localhost = '192.168.x.x'

# Global Stuff
serverIP = socket.gethostbyname(socket.gethostname())
#serverIP = '192.168.x.x'
serverPort, MsgSendError, MsgSendSucc, clientPort, data, buffer =\
 5003, False, True, 12345, '',1024 #Bytes

class client(object):
    global MsgSendError, MsgSendSucc, buffer, data

    ''' Constructor to Establish Connection once client is up'''
    def __init__(self, serverIP, serverPort):   # Connect Tcp
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            self.sock.connect((serverIP, serverPort))
        except Exception, e:
            return "[Connecting to Server]", e

    def send(self, data):
        try:
            self.sock.send(data) # covnert it from string into byte streams to be in proper format.
            #print str(data)
            return MsgSendSucc
        except:
            return MsgSendError 
    def receive2(self):
        try:
            data = self.sock.recv(buffer)
            #print "Function: Receive2."# testing
            #print(str(data))# testing
            #print "Received!"# testing
            return str(data)
        except Exception, e:
            return "[In receive2]", e

def main():
    global serverIP, serverPort, data#, sock
    clientObj = client(serverIP, serverPort)
    alias = raw_input("Your Name USER! ")
    sentData = ''

    while sentData is not 'Quit':
        sentData = raw_input("Data>> ")
        data = alias + ": "+sentData
        if clientObj.send(data) == MsgSendSucc:
            #print "Sent!"
            #print "Fetching..\n"# testing
            print(clientObj.receive2())
# testing
main()

0 个答案:

没有答案