Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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
Select/Thread Python中的多客户端服务器在收到第一条消息后挂起_Python_Multithreading_Sockets_Select - Fatal编程技术网

Select/Thread Python中的多客户端服务器在收到第一条消息后挂起

Select/Thread Python中的多客户端服务器在收到第一条消息后挂起,python,multithreading,sockets,select,Python,Multithreading,Sockets,Select,我想写一个能够处理多个客户端的服务器,通过select和threads 我知道如何仅使用线程,或仅使用选择编写服务器。现在,我想把它们混合在一起。但我似乎失败了 服务器: import threading import socket import select class Client(threading.Thread): ''' Multi-threading clients. ''' def __init__(self): threadi

我想写一个能够处理多个客户端的服务器,通过
select
threads

我知道如何仅使用
线程
,或仅使用
选择
编写服务器。现在,我想把它们混合在一起。但我似乎失败了

服务器:

import threading
import socket
import select


class Client(threading.Thread):
    '''
    Multi-threading clients.
    '''

    def __init__(self):
        threading.Thread.__init__(self)
        pass

    def setup(self, __client, __address):
        self.client = __client
        self.address = __address

    def connect(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def run(self):
        print self.client.__class__
        data = self.client.recv(1024)
        if data:
            self.client.sendall(data)
        else:
            print "Error:", self.address


class Server(object):
    '''
    Threading server
    '''

    def __init__(self):
        '''
        Constructor
        '''
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind(('127.0.0.1', 9876))

    def run(self):
        self.server.listen(10)
        inputs = [self.server]
        while 1:
            inready, outready, excready = select.select(inputs, [], []);

            for s in inready:
                if s == self.server:
                    sock, address = self.server.accept();
                    client = Client()
                    client.setup(sock, address)
                    client.start()

        self.server.close()


if __name__ == '__main__':
    server = Server()
    server.run()
import socket
import sys

port = 9876
size = 1024
s = None
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostname()
    s.connect(('127.0.0.1', port))
except socket.error, (value, message):
    if s:
        s.close()
    print "Could not open socket: " + message
    sys.exit(1)
while True:
    data = raw_input('> ')
    s.sendall(data)
    data = s.recv(size)
    print "Server sent: %s " % data
s.close()
import threading import socket import select


class Client(threading.Thread):
    '''
    Multi-threading clients.
    '''

    def __init__(self):
        threading.Thread.__init__(self)
        pass

    def setup(self, __client, __address):
        self.client = __client
        self.address = __address

    def connect(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def run(self):
        while True:
            print self.client.__class__
            data = self.client.recv(1024)
            if data:
                self.client.sendall(data)
            else:
                print "Error:", self.address
                self.client.close()


class Server(object):
    '''
    Threading server
    '''

    def __init__(self):
        '''
        Constructor
        '''
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind(('127.0.0.1', 9876))

    def run(self):
        self.server.listen(10)
        inputs = [self.server]
        while 1:
            inready, outready, excready = select.select(inputs, [], []);

            for s in inready:
                if s == self.server:
                    sock, address = self.server.accept();
                    client = Client()
                    client.setup(sock, address)
                    client.start()

        self.server.close()


if __name__ == '__main__':
    server = Server()
    server.run()
客户端:

import threading
import socket
import select


class Client(threading.Thread):
    '''
    Multi-threading clients.
    '''

    def __init__(self):
        threading.Thread.__init__(self)
        pass

    def setup(self, __client, __address):
        self.client = __client
        self.address = __address

    def connect(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def run(self):
        print self.client.__class__
        data = self.client.recv(1024)
        if data:
            self.client.sendall(data)
        else:
            print "Error:", self.address


class Server(object):
    '''
    Threading server
    '''

    def __init__(self):
        '''
        Constructor
        '''
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind(('127.0.0.1', 9876))

    def run(self):
        self.server.listen(10)
        inputs = [self.server]
        while 1:
            inready, outready, excready = select.select(inputs, [], []);

            for s in inready:
                if s == self.server:
                    sock, address = self.server.accept();
                    client = Client()
                    client.setup(sock, address)
                    client.start()

        self.server.close()


if __name__ == '__main__':
    server = Server()
    server.run()
import socket
import sys

port = 9876
size = 1024
s = None
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostname()
    s.connect(('127.0.0.1', port))
except socket.error, (value, message):
    if s:
        s.close()
    print "Could not open socket: " + message
    sys.exit(1)
while True:
    data = raw_input('> ')
    s.sendall(data)
    data = s.recv(size)
    print "Server sent: %s " % data
s.close()
import threading import socket import select


class Client(threading.Thread):
    '''
    Multi-threading clients.
    '''

    def __init__(self):
        threading.Thread.__init__(self)
        pass

    def setup(self, __client, __address):
        self.client = __client
        self.address = __address

    def connect(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def run(self):
        while True:
            print self.client.__class__
            data = self.client.recv(1024)
            if data:
                self.client.sendall(data)
            else:
                print "Error:", self.address
                self.client.close()


class Server(object):
    '''
    Threading server
    '''

    def __init__(self):
        '''
        Constructor
        '''
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind(('127.0.0.1', 9876))

    def run(self):
        self.server.listen(10)
        inputs = [self.server]
        while 1:
            inready, outready, excready = select.select(inputs, [], []);

            for s in inready:
                if s == self.server:
                    sock, address = self.server.accept();
                    client = Client()
                    client.setup(sock, address)
                    client.start()

        self.server.close()


if __name__ == '__main__':
    server = Server()
    server.run()
客户端只发送和接收一条消息,然后Im无法再发送任何消息。为什么?如何改进这一点?多谢各位

编辑:发现一个错误。客户端的运行方法中缺少循环:

import threading
import socket
import select


class Client(threading.Thread):
    '''
    Multi-threading clients.
    '''

    def __init__(self):
        threading.Thread.__init__(self)
        pass

    def setup(self, __client, __address):
        self.client = __client
        self.address = __address

    def connect(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def run(self):
        print self.client.__class__
        data = self.client.recv(1024)
        if data:
            self.client.sendall(data)
        else:
            print "Error:", self.address


class Server(object):
    '''
    Threading server
    '''

    def __init__(self):
        '''
        Constructor
        '''
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind(('127.0.0.1', 9876))

    def run(self):
        self.server.listen(10)
        inputs = [self.server]
        while 1:
            inready, outready, excready = select.select(inputs, [], []);

            for s in inready:
                if s == self.server:
                    sock, address = self.server.accept();
                    client = Client()
                    client.setup(sock, address)
                    client.start()

        self.server.close()


if __name__ == '__main__':
    server = Server()
    server.run()
import socket
import sys

port = 9876
size = 1024
s = None
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostname()
    s.connect(('127.0.0.1', port))
except socket.error, (value, message):
    if s:
        s.close()
    print "Could not open socket: " + message
    sys.exit(1)
while True:
    data = raw_input('> ')
    s.sendall(data)
    data = s.recv(size)
    print "Server sent: %s " % data
s.close()
import threading import socket import select


class Client(threading.Thread):
    '''
    Multi-threading clients.
    '''

    def __init__(self):
        threading.Thread.__init__(self)
        pass

    def setup(self, __client, __address):
        self.client = __client
        self.address = __address

    def connect(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def run(self):
        while True:
            print self.client.__class__
            data = self.client.recv(1024)
            if data:
                self.client.sendall(data)
            else:
                print "Error:", self.address
                self.client.close()


class Server(object):
    '''
    Threading server
    '''

    def __init__(self):
        '''
        Constructor
        '''
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind(('127.0.0.1', 9876))

    def run(self):
        self.server.listen(10)
        inputs = [self.server]
        while 1:
            inready, outready, excready = select.select(inputs, [], []);

            for s in inready:
                if s == self.server:
                    sock, address = self.server.accept();
                    client = Client()
                    client.setup(sock, address)
                    client.start()

        self.server.close()


if __name__ == '__main__':
    server = Server()
    server.run()
但现在,当客户端断开连接时,服务器端出现了一个错误。如何处理这个错误

Exception in thread Thread-4:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/home/testserver.py", line 25, in run
    data = self.client.recv(1024)
  File "/usr/lib/python2.7/socket.py", line 174, in _dummy
    raise error(EBADF, 'Bad file descriptor')
error: [Errno 9] Bad file descriptor

Client.run
将只提供一次发送/接收,直到线程终止,但连接保持打开状态。@user2896976:谢谢!我不知怎么错过了。但当客户端断开连接时,服务器端的错误又如何呢?如何正确处理?在
客户端中放置
try
块。当套接字突然断开连接时,运行
方法进行处理。