Из моего понимания питон может работать только 1 поток в то время, так что если бы я сделать что-то вроде этогоPython - многопоточные розетки
import socket, select
from threading import Thread
import config
class Source(Thread):
def __init__(self):
self._wait = False
self._host = (config.HOST, config.PORT + 1)
self._socket = socket.socket()
self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self._sock = None
self._connections = []
self._mount = "None"
self._writers = []
self._createServer()
Thread.__init__(self)
def _createServer(self):
self._socket.bind(self._host)
self._socket.listen(2)
self._connections.append(self._socket)
self._audioPackets=[]
def _addPacket(self, packet):
self._audioPackets.append(packet)
def _removePacket(self, packet):
self._audioPackets.remove(packet)
def _getPacket(self):
if len(self._audioPackets) > 0:
return self._audioPackets[0]
else:
return None
def _sendOK(self, sock):
sock.send("OK")
def _sendDenied(self, sock):
sock.send("DENIED")
def _sendMount(self, sock):
sock.send("mount:{0}".format(self._mount))
def _sendBufPacket(self, sock, packet):
packet = "buffer:%s" % packet
sock.send(packet)
def recv(self, sock, data):
data = data.split(":", 1)
if data[0] == "WAIT": self._wait = True
elif data[0] == "STOP_WAITING": self._wait = False
elif data[0] == "LOGIN":
if data[1] == config.SOURCE_AUTH:
self._source = sock
self._sendOK(sock)
else:
self._sendClose(sock)
elif data[0] == "MOUNT":
if self._source == sock:
self._mount = data[1]
else:
self._sendClose(sock)
elif data[0] == "CLIENT":
self._sendMount(sock)
self._writers.append(sock)
def _sendCloseAll(self):
for sock in self._connections:
sock.send("CLOSE")
sock.close()
def _sendClose(self, sock):
sock.send("CLOSE")
sock.close()
def main(self):
while True:
rl, wl, xl = select.select(self._connections, self._writers, [], 0.2)
for sock in rl:
if sock == self._socket:
con, ip = sock.accept()
self._connections.append(con)
else:
data = sock.recv(config.BUFFER)
if data:
self.recv(sock, data)
else:
if sock in self._writers:
self._writers.remove(sock)
if sock in self._connections:
self._connections.remove(sock)
for sock in wl:
packet = self._getPacket()
if packet != None:
self._sendBufPacket(sock, packet)
def run(self):
self.main()
class writeThread(Thread):
def __init__(self):
self.running = False
def make(self, client):
self.client = client
self.running = True
def run(self):
host = (config.HOST, config.PORT+1)
sock = socket.socket()
sock.connect(host)
sock.send("CLIENT")
sock.send("MOUNT:mountpoint")
while self.running:
data = sock.recv(config.BUFFER)
if data:
data = data.split(":", 1)
if data[0] == "buffer":
self.client.send(data[1])
elif data[0] == "CLOSE":
self.client.close()
break
if __name__=="__main__":
source = Source()
source.start()
webserver = WebServer()
webserver.runloop()
, если мне нужно, чтобы построить веб-сервер части я. Но я объясню это. Итак, в основном, когда кто-то подключается к веб-серверу под установленной точкой монтирования, у них будет собственный личный поток, который затем захватывает данные от Source()
и отправляет их им. Теперь скажите, что другой человек подключается к точке монтирования, а последний клиент, а также источник все еще идет. Разве новый клиент не будет заблокирован от получения исходных данных, учитывая наличие двух активных потоков?
'client, address = self.sock.accept()' не приведет ли это к ошибке при подключении другого клиента или при повторном подключении клиента? –
У меня не было проблемы с подключением 3 клиентов одновременно. self.sock.listen (3) настраивает сервер для одновременного приема 3 клиентов. Оказывается, переменная «адрес» фактически содержит две части информации. Первая часть - это IP-адрес клиента, который должен быть 127.0.0.1, если вы запустите этот код. Вторая часть информации - это «адресная» переменная - это уникальный идентификатор для каждого подключенного клиента. Поэтому каждый клиент получит свой собственный идентификатор. В настоящее время этот код недостаточно сложный, чтобы клиенты могли повторно подключаться. Это должно быть чем-то, что я выдумываю на более позднем стыке. – jberry