我正在尝试创建一个脚本,通过我的服务器(一个永不结束的.ts
流)直播视频流。此外,此流正在通过另一个可以访问原始视频流的代理。
我设法写了一些有效的代码,它能够从原始源获取流,通过代理并将其流式传输到客户端,但它一次只能用于一个客户端(只有一个流)可以通过),应用程序的其余部分或其他请求只是保持挂起并永远不会完成,直到正在观看流的当前用户关闭它。
我正在使用asyncore调度程序,我认为这应该是已经实现了线程/异步并且它应该自己处理多个用户,但是我错了,或者我在代码中搞错了(这很可能是这种情况) )。
从下面的代码中可以看出,我使用asyncore中的示例客户端/服务器应用程序开始:
class EchoHandler(threading.Thread, asyncore.dispatcher):
def __init__(self, sock):
self.channel_lock = threading.Lock()
asyncore.dispatcher.__init__(self, sock)
def handle_read(self):
self.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
header = self.recv(300)
header = str(header)
url = (header.split('\n', 1)[0])[5:-10]
threading.Thread(target=self.send_stream(), args=(url, ))
#self.send_stream(url)
#if data:
#self.send(data)
def handle_close(self):
self.s.close()
print "Connection closed"
self.close()
def send_stream(self, url):
CRLF = "\r\n"
request = [
"GET "+ url +" HTTP/1.1",
"Host: X.X.X.X",
"Connection: Close",
"",
"",
]
# Connect to the server
self.s = socket.socket()
self.s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
self.s.connect(('X.X.X.X', 3128))
# Send an HTTP request
self.s.send(CRLF.join(request))
# Get the response (in several parts, if necessary)
response = ''
buffer = self.s.recv(50)
while buffer:
self.send(buffer)
buffer = self.s.recv(50)
self.close()
class EchoServer(asyncore.dispatcher):
def __init__(self, host, port):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
self.set_reuse_addr()
self.bind((host, port))
self.listen(50)
def handle_accept(self):
pair = self.accept()
if pair is not None:
sock, addr = pair
print 'Incoming connection from %s' % repr(addr)
EchoHandler(sock)
server = EchoServer('localhost', 5555)
asyncore.loop()
这基本上就是整个代码。
正如您可能也看到的那样,我曾尝试使用线程进行操作,但却没有尝试,因为它根本不起作用。