Сокеты клиента Python, подключаемые к одному и тому же порту сокета сервера

Я работаю в первый раз на сокетах с python. Мне нужно подключить больше, чем клиентский сокет к одному и тому же серверному сокету.

Для этого я использовал следующий код:

import socket import time import random from threading import Thread import thread import subprocess, signal, os class ServerObject: def __init__(self, port): self.socket = '' self.host = '' self.port = port self.conn = '' self.data = '' print "Server port is: ", self.port def openSocketConnectionAsServer(self): self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.bind((self.host, self.port)) self.socket.listen(5) self.conn, addr = self.socket.accept() print 'Server Connected by', addr def getData(self): return self.data def getHost(self): return self.host def getPort(self): return self.port def sendMessage(self, message): try : self.conn.sendall(message) except socket.error: print 'Server Send failed' sys.exit() def receiveMessageFromClient(self): while 1: reply = self.conn.recv(4096) if not self.data: break return reply def receiveMessageFromServer(self): reply = self.socket.recv(4096) return reply def closeConnectionAsServer(self): self.socket.shutdown(1) self.socket.close() del self.socket class ClientObject: def __init__(self): self.data = str(random.choice('abcdefghil')) print "Client Data Random: ", self.data self.host = 'localhost' self.port = '' def openSocketConnectionAsClient(self): self.port = 50000 + random.randint(1,3) print "Client socket port is: ", self.port try: self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error: print 'Client Failed to create socket' sys.exit() print 'Client Socket Created' try: remote_ip = socket.gethostbyname( self.host ) except socket.gaierror: print 'Client Hostname could not be resolved. Exiting' sys.exit() self.socket.connect((remote_ip , self.port)) def getData(self): return self.data def getHost(self): return self.host def getPort(self): return self.port def sendMessage(self, message): try : self.socket.sendall(message) except socket.error: print 'Client Send failed' os.sys.exit() def receiveMessageFromServer(self): reply = self.socket.recv(4096) return reply def closeConnection(self): self.socket.shutdown(1) self.socket.close() del self.socket def clientProcess(): print "Client Start the client process" client1 = ClientObject() for i in range(1,10): try: print "Client try to open the connection socket: attempt number ",i client1.openSocketConnectionAsClient() print "Client connection socket established on port ", client1.getPort() break except socket.error: print "Client connection error on the port ", client1.getPort() if i == 10: os.sys.exit() print "Client send the message" client1.sendMessage(client1.getData()) print "Client receive the message back" client1.receiveMessageFromServer() print "Client Data requested: ", client1.getData(), " Hostname: ", client1.getHost(), " Port: ", client1.getPort() print "Client Close connection" client1.closeConnection() def serverProcess(port=40007): print "Server oject create" server = ServerObject(port) print "Server open connection as server" server.openSocketConnectionAsServer() print "Server receive the client message" receivedMessage = server.receiveMessageFromClient() message = "Server Data requested are: "+receivedMessage print "Server send the message back to the client" server.sendMessage(message) print "Server close the connection with the client" server.closeConnectionAsServer() if __name__ == '__main__': threadServer = Thread(target=serverProcess, args=[50001]) print "New Server thread created with name: ", threadServer.getName() threadServer.start() for i in range(1,3): threadClient = Thread(target=clientProcess) print "New Client thread created with name: ", threadClient.getName() threadClient.start() threadClient.join() 

Когда я запускаю его, первый клиент может подключиться к серверу, второй никогда не подключается, хотя я закрываю соединение (с сервера и клиента) в конце первого клиентского потока.

Пожалуйста, может кто-нибудь сказать мне, что случилось в моем коде?

благодаря

    2 Solutions collect form web for “Сокеты клиента Python, подключаемые к одному и тому же порту сокета сервера”

    Я бы настоятельно рекомендовал использовать отличный модуль socketserver для выполнения подобных socketserver . Что касается вашего кода, проблема в том, что ваш поточный сервер сокетов работает только в одном потоке. По крайней мере, вы должны создать новый поток для обработки соединения после accept нового соединения в openSocketConnectionAsServer .

    То, что сказал @Ber, было правильным, но неполным.

    Вы проблема здесь:

     self.socket.listen(5) self.conn, addr = self.socket.accept() 

    listen откроет порт и подготовится к подключению. accept будет ждать следующего соединения.

    В то время как вам нужно только один раз listen , вы должны вызывать accept несколько раз, один раз за соединение. Это можно сделать несколькими способами. Для начала вы можете снова позвонить, когда текущее соединение закроется, но это позволит только одному клиенту за раз. Лучше иметь один вызов потока, чтобы ждать следующего соединения, но запустите рабочий поток для обработки каждого из них.

    Или вы можете использовать неблокирующий ввод-вывод , но если вы пойдете так, проверьте Twisted .

     
    Interesting Posts for Van-Lav

    Безопасное отображение C # REST API для языка сценариев, такого как Python

    Хорошая практика использования try-except-else в Python?

    Есть ли способ в Python возвращать значение через выходной параметр?

    Можно ли установить необязательный аргумент argparse в значение по умолчанию, основанное на другом необязательном аргументе?

    Рекурсивный факториал с использованием dict вызывает RecursionError

    Как вернуть функцию, использующую значение переменной?

    Как установить mechanize для Python 2.7?

    Функции из пакетов Python для udf () фрейма Spark

    Python Fabric дает: Неустранимая ошибка: нет существующего сеанса

    Как мне получить путь к скрипту Python, в котором я запущен?

    Как установить фоновый рисунок рабочего стола в python? (окна)

    Использование кросс-платформенной платформы для python

    Cython: преобразовать представление памяти в массив NumPy

    Как установить sys.excepthook для вызова pdb глобально в python?

    Альтернативы python griddata

    Python - лучший язык программирования в мире.