杀死一个带有套接字的线程(python)

时间:2013-04-16 21:48:33

标签: python multithreading sockets

我很擅长这个。我正在尝试构建服务器(聊天服务器)  很抱歉出现这样一个混乱的代码。 关于这段代码我会改变很多事情。 但截至目前,我只需要帮助一件事:

当我开始让我们说更多然后一个关于这个...然后关闭客户端我得到这个消息:

启动的线程中未处理的异常

我已尝试杀死该线程,您可以在此代码中的许多地方看到。但我不知道我做错了什么.. 我是新来的。 关于我应该做什么的任何想法?

#encoding: utf-8

import socket, random, time, thread, errno, traceback

print socket.gethostname()
print "current machines IP address: "+socket.gethostbyname(socket.gethostname())

host ="10.0.0.1"# raw_input("IP: ")
# = socket.gethostbyname(socket.gethostname())
port = 12345

print host

conn_list =[None]*10
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((host, port))
sock.listen(10)

print "connected..\n\n\n\n"

def recv(conn):
    while True:
        try:
            message = conn.recv(1024)
            if "MESG" == message[1:5]:
                message = message[6:].split(':')
                name = str(conn)
                conn_number = conn_list.index(conn)
                conn_name = str(conn_number)
                message = message[2]
                reciever = message[0:1]
                reciever = int(reciever)
                for conn in conn_list:
                    if reciever == conn_list.index(conn):
                        conn.send(message)
                        print "Connection   "+conn_name+"  ----->  "+str(reciever)+"   :"+message+"\n"
                        #conn = findTheRightConnection(conn_list, conn_number)
                        break
                    else:
                        pass

        except ValueError:
            print "ValueError by %s" % (str(conn))
            print conn.send("\nOpps you are not typing the correct connection number infront  your message!")

        except IOError:
            bye(conn,conn_list)
            print"Going to try to kill the thread here "
            thread.quit()
            thread.isAlive()
            print "Still alive..."

        except socket.error, v:
            errorcode=v[0]
            bye(conn,conn_list)
            print"Going to try to kill the thread or here"
            thread.quit()
            thread.isAlive()
            print "Still alive..."


        except Exception, e:
            traceback.print_exc()

        finally:
            thread.isAlive()
            print"\nChanging the conn back to what it was... "
            conn = findTheRightConnection(conn_list, conn_number)


def handle_connection(conn):
    try:
        recv(conn)

    except socket.error, v:
        errorcode=v[104]
        bye(conn)


def bye(conn,conn_list):
    i= 0
    print "bye"
    connectionName = str(conn_list.index(conn))
    conn.close
    conn_list = conn_list
    print conn_list
    for element in conn_list:
        if element == conn:
            conn_list[i] = None
            break
        i += i
        print "Connection number "+connectionName+" is terminated"
        print conn_list

        return "Connection Terminated"


def welcome(conn,conn_list):
    i = 0
    for element in conn_list:
        if element == None:
            conn_list[i] = conn
            print "Connection added in the conn_list on the slot %d" % (i)
            print conn_list
            return conn_list

        else:
            i = i+1
            pass
    print "The server if full! No more space left"
    return conn_list


def findTheRightConnection(conn_list, number):
    for conn in conn_list:
        if number == conn_list.index(conn):
            return conn
        else:
            pass

        print "\nSomthing went wrong while trying to find the right connection in the method findTheRightConnection()"
        return


while True:
    conn, addr = sock.accept()
    conn_list = welcome(conn,conn_list)
    print "Got connection from : "+str(addr[0])+" by connection number: "+str(conn_list.index(conn))+"\n\n\n\n"     
    msg = "Welcome to the server!"
    conn.send(":INFO:"+str(int(time.time()))+":"+str(len(msg))+":"+msg)
    thread.start_new_thread(handle_connection, (conn,))

1 个答案:

答案 0 :(得分:0)

如果您仍然无法在Python中创建即时消息程序,则可能会对另一个问题this answer感兴趣。

  • Simple_Server.py 是最小的服务器实现。可根据要求提供具有各种功能的更复杂的服务器。复杂的服务器支持身份验证,朋友,私人消息,渠道,过滤器,数学评估和管理控制。
  • MultichatClient.py 是由教师从网络类编写的Java程序的一个端口。程序必须从命令行运行,并且必须将服务器作为参数。您可以使用网络上的服务器名称或其IP地址。
  • Simple_Client.pyw 是一个更复杂的客户端,不需要从命令行启动。当它启动时,它会询问服务器的名称,并在显示进度对话框时尝试连接它。程序将自动尝试将任何错误记录到文件中。
  • 要运行 threadbox.py ,需要
  • affinity.py 。 (在特定线程上运行代码而不管原点)
  • 要运行 safetkinter.py ,需要
  • threadbox.py 。 (元类克隆类使用亲和力运行)
  • Simple_Client.pyw 需要
  • safetkinter.py 才能运行。 (使tkinter可以安全地与线程一起使用)