Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:线程只能启动一次_Python_Multithreading - Fatal编程技术网

Python:线程只能启动一次

Python:线程只能启动一次,python,multithreading,Python,Multithreading,我正在写一个简单的聊天,目前它只是连接一个用户 bootchat/ --server.py --client.py --libbootchat/ --bootchat_connection.py --bootchat_server.py --bootchat_user.py 代码: client.py # imports import libbootchat.bootchat_user as user import socket print("Welcom

我正在写一个简单的聊天,目前它只是连接一个用户

bootchat/
  --server.py
  --client.py
  --libbootchat/
    --bootchat_connection.py
    --bootchat_server.py
    --bootchat_user.py
代码:

client.py

# imports
import libbootchat.bootchat_user as user
import socket

print("Welcome on BootChat")


nickname = input("nickname : ")

bootchat_user = user.BootchatUser(nickname)
# imports
import socket
import signal
import libbootchat.bootchat_server as server
import libbootchat.bootchat_connection as connection

print("Starting server...")
bootchat_server = server.BootchatServer()



while True:
    bootchat_server.accept_connection()
    bootchat_server.start()
class BootchatConnection():

    def __init__(self, socket, informations=None):
        self.socket = socket

        if informations:
            self.ip = informations[0]
            self.port = informations[1]

    def connect_to_server(self, ip, port):
        self.socket.connect((ip, port))

    def send_to_server(self, msg):
        self.socket.send(msg.encode())

    def recv_from_client(self):
        return self.socket.recv(1024).decode()
from libbootchat.bootchat_connection import BootchatConnection
import socket

class BootchatUser:
    nb_users = 0

    def __init__(self, nickname):
        self.nickname = nickname
        connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.bootchat_connection = BootchatConnection(connection)
        self.bootchat_connection.connect_to_server("localhost", 15297)
        self.send_message(nickname)

    def send_message(self, msg):
        self.bootchat_connection.send_to_server(msg)
import socket
from threading import Thread
from libbootchat.bootchat_connection import BootchatConnection

class BootchatServer(Thread):

    def __init__(self):
        Thread.__init__(self)
        self.listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.listener.bind(('', 15297))
        self.listener.listen(5)

    def accept_connection(self):
        socket, infos = self.listener.accept()
        self.bootchat_connection = BootchatConnection(socket, infos)

    def run(self):
        print("[INFO] New user connected from {}".format(self.bootchat_connection.ip))
        nickname = self.bootchat_connection.recv_from_client()
        print("[INFO] User from {} now logged at {}".format(self.bootchat_connection.ip, nickname))
server.py

# imports
import libbootchat.bootchat_user as user
import socket

print("Welcome on BootChat")


nickname = input("nickname : ")

bootchat_user = user.BootchatUser(nickname)
# imports
import socket
import signal
import libbootchat.bootchat_server as server
import libbootchat.bootchat_connection as connection

print("Starting server...")
bootchat_server = server.BootchatServer()



while True:
    bootchat_server.accept_connection()
    bootchat_server.start()
class BootchatConnection():

    def __init__(self, socket, informations=None):
        self.socket = socket

        if informations:
            self.ip = informations[0]
            self.port = informations[1]

    def connect_to_server(self, ip, port):
        self.socket.connect((ip, port))

    def send_to_server(self, msg):
        self.socket.send(msg.encode())

    def recv_from_client(self):
        return self.socket.recv(1024).decode()
from libbootchat.bootchat_connection import BootchatConnection
import socket

class BootchatUser:
    nb_users = 0

    def __init__(self, nickname):
        self.nickname = nickname
        connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.bootchat_connection = BootchatConnection(connection)
        self.bootchat_connection.connect_to_server("localhost", 15297)
        self.send_message(nickname)

    def send_message(self, msg):
        self.bootchat_connection.send_to_server(msg)
import socket
from threading import Thread
from libbootchat.bootchat_connection import BootchatConnection

class BootchatServer(Thread):

    def __init__(self):
        Thread.__init__(self)
        self.listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.listener.bind(('', 15297))
        self.listener.listen(5)

    def accept_connection(self):
        socket, infos = self.listener.accept()
        self.bootchat_connection = BootchatConnection(socket, infos)

    def run(self):
        print("[INFO] New user connected from {}".format(self.bootchat_connection.ip))
        nickname = self.bootchat_connection.recv_from_client()
        print("[INFO] User from {} now logged at {}".format(self.bootchat_connection.ip, nickname))
bootchat\u connection.py

# imports
import libbootchat.bootchat_user as user
import socket

print("Welcome on BootChat")


nickname = input("nickname : ")

bootchat_user = user.BootchatUser(nickname)
# imports
import socket
import signal
import libbootchat.bootchat_server as server
import libbootchat.bootchat_connection as connection

print("Starting server...")
bootchat_server = server.BootchatServer()



while True:
    bootchat_server.accept_connection()
    bootchat_server.start()
class BootchatConnection():

    def __init__(self, socket, informations=None):
        self.socket = socket

        if informations:
            self.ip = informations[0]
            self.port = informations[1]

    def connect_to_server(self, ip, port):
        self.socket.connect((ip, port))

    def send_to_server(self, msg):
        self.socket.send(msg.encode())

    def recv_from_client(self):
        return self.socket.recv(1024).decode()
from libbootchat.bootchat_connection import BootchatConnection
import socket

class BootchatUser:
    nb_users = 0

    def __init__(self, nickname):
        self.nickname = nickname
        connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.bootchat_connection = BootchatConnection(connection)
        self.bootchat_connection.connect_to_server("localhost", 15297)
        self.send_message(nickname)

    def send_message(self, msg):
        self.bootchat_connection.send_to_server(msg)
import socket
from threading import Thread
from libbootchat.bootchat_connection import BootchatConnection

class BootchatServer(Thread):

    def __init__(self):
        Thread.__init__(self)
        self.listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.listener.bind(('', 15297))
        self.listener.listen(5)

    def accept_connection(self):
        socket, infos = self.listener.accept()
        self.bootchat_connection = BootchatConnection(socket, infos)

    def run(self):
        print("[INFO] New user connected from {}".format(self.bootchat_connection.ip))
        nickname = self.bootchat_connection.recv_from_client()
        print("[INFO] User from {} now logged at {}".format(self.bootchat_connection.ip, nickname))
bootchat\u user.py

# imports
import libbootchat.bootchat_user as user
import socket

print("Welcome on BootChat")


nickname = input("nickname : ")

bootchat_user = user.BootchatUser(nickname)
# imports
import socket
import signal
import libbootchat.bootchat_server as server
import libbootchat.bootchat_connection as connection

print("Starting server...")
bootchat_server = server.BootchatServer()



while True:
    bootchat_server.accept_connection()
    bootchat_server.start()
class BootchatConnection():

    def __init__(self, socket, informations=None):
        self.socket = socket

        if informations:
            self.ip = informations[0]
            self.port = informations[1]

    def connect_to_server(self, ip, port):
        self.socket.connect((ip, port))

    def send_to_server(self, msg):
        self.socket.send(msg.encode())

    def recv_from_client(self):
        return self.socket.recv(1024).decode()
from libbootchat.bootchat_connection import BootchatConnection
import socket

class BootchatUser:
    nb_users = 0

    def __init__(self, nickname):
        self.nickname = nickname
        connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.bootchat_connection = BootchatConnection(connection)
        self.bootchat_connection.connect_to_server("localhost", 15297)
        self.send_message(nickname)

    def send_message(self, msg):
        self.bootchat_connection.send_to_server(msg)
import socket
from threading import Thread
from libbootchat.bootchat_connection import BootchatConnection

class BootchatServer(Thread):

    def __init__(self):
        Thread.__init__(self)
        self.listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.listener.bind(('', 15297))
        self.listener.listen(5)

    def accept_connection(self):
        socket, infos = self.listener.accept()
        self.bootchat_connection = BootchatConnection(socket, infos)

    def run(self):
        print("[INFO] New user connected from {}".format(self.bootchat_connection.ip))
        nickname = self.bootchat_connection.recv_from_client()
        print("[INFO] User from {} now logged at {}".format(self.bootchat_connection.ip, nickname))
bootchat_server.py

# imports
import libbootchat.bootchat_user as user
import socket

print("Welcome on BootChat")


nickname = input("nickname : ")

bootchat_user = user.BootchatUser(nickname)
# imports
import socket
import signal
import libbootchat.bootchat_server as server
import libbootchat.bootchat_connection as connection

print("Starting server...")
bootchat_server = server.BootchatServer()



while True:
    bootchat_server.accept_connection()
    bootchat_server.start()
class BootchatConnection():

    def __init__(self, socket, informations=None):
        self.socket = socket

        if informations:
            self.ip = informations[0]
            self.port = informations[1]

    def connect_to_server(self, ip, port):
        self.socket.connect((ip, port))

    def send_to_server(self, msg):
        self.socket.send(msg.encode())

    def recv_from_client(self):
        return self.socket.recv(1024).decode()
from libbootchat.bootchat_connection import BootchatConnection
import socket

class BootchatUser:
    nb_users = 0

    def __init__(self, nickname):
        self.nickname = nickname
        connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.bootchat_connection = BootchatConnection(connection)
        self.bootchat_connection.connect_to_server("localhost", 15297)
        self.send_message(nickname)

    def send_message(self, msg):
        self.bootchat_connection.send_to_server(msg)
import socket
from threading import Thread
from libbootchat.bootchat_connection import BootchatConnection

class BootchatServer(Thread):

    def __init__(self):
        Thread.__init__(self)
        self.listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.listener.bind(('', 15297))
        self.listener.listen(5)

    def accept_connection(self):
        socket, infos = self.listener.accept()
        self.bootchat_connection = BootchatConnection(socket, infos)

    def run(self):
        print("[INFO] New user connected from {}".format(self.bootchat_connection.ip))
        nickname = self.bootchat_connection.recv_from_client()
        print("[INFO] User from {} now logged at {}".format(self.bootchat_connection.ip, nickname))
问题:

我启动了服务器,启动了第一个客户机,我发送了一个昵称,我没有任何问题,我的服务器正确地打印了“新用户已连接…”,但之后,我启动了第二个客户机,我有一个错误。这是my server.py的输出:

    Starting server...
[INFO] New user connected from 127.0.0.1
[INFO] User from 127.0.0.1 now logged at Alex
Traceback (most recent call last):
  File "server.py", line 14, in <module>
    bootchat_server.start()
  File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/threading.py", line 840, in start
    raise RuntimeError("threads can only be started once")
RuntimeError: threads can only be started once
正在启动服务器。。。
[信息]从127.0.0.1连接的新用户
[信息]来自127.0.0.1的用户现在登录到Alex
回溯(最近一次呼叫最后一次):
文件“server.py”,第14行,在
bootchat_server.start()
文件“/usr/local/ceral/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/threading.py”,第840行,开头
raise RUNTIMERROR(“线程只能启动一次”)
RuntimeError:线程只能启动一次

有什么想法吗?谢谢

为每个连接生成一个新线程:

class BootchatServer(object):

    def __init__(self):
        self.listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.listener.bind(('', 15297))
        self.listener.listen(5)

    def accept_connection(self):
        socket, infos = self.listener.accept()
        connection = BootchatConnection(socket, infos)
        thread = Thread(target=self.process_connection, args=(connection,))
        thread.start()

    def process_connection(self, connection):
        print("[INFO] New user connected from {}".format(connection.ip))
        nickname = connection.recv_from_client()
        print("[INFO] User from {} now logged at {}".format(connection.ip, nickname))

print("Starting server...")
bootchat_server = server.BootchatServer()

while True:
    bootchat_server.accept_connection()

不要为每个文件创建一个类,您可以将所有内容都放在一个文件中。正如错误消息所示:在第一个客户端连接之后,您已经有一个
bootch\u服务器
线程在运行。不能使用同一线程对象启动另一个线程。您可能希望在接受之后创建处理程序线程,并传递套接字。实际上,我只有一个对象bootchat_服务器,因此我可以启动多个startDaniel,java habits:D@AlexandreMarkiewicz如果用户本身是异步的(人们通常是异步的),那么正如Daniel在回答中所说,每个连接都需要单独的线程。。