我正在连续将数据发送给客户端的服务器上工作。该客户端还可以与服务器发送特定请求的服务器进行概括。我写了一个守护程序来做到这一点。请注意,此守护程序在线程中起作用。目前,脚本的结构如下:
class MyDaemon(threading.Thread):
def __init__(self):
# Init Stream socket (output)
self.MainSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.MainSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.MainSock.bind(('', 15555))
self.MainSock.listen(5)
self.MainSock.setblocking(0)
# Init Request socket (input)
self.RequestSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.RequestSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.RequestSock.bind(('', 15556))
self.RequestSock.listen(5)
self.RequestSock.setblocking(0)
def run(self):
while True:
# Listen to connection on MainSock
try:
self.stream, address = self.MainSock.accept()
except:
pass
# Listen to connection on RequestSock
try:
self.request, address = self.RequestSock.accept()
except:
pass
if self.stream:
send_message_continuously() # it is a stream
if self.request:
recv_a_message_from_client()
do_whatever_action_the client_request()
问题是:
仅使用蒸汽器,一切都很好。
仅使用请求者,都可以正常工作。
同时使用两个插座阻止了流媒体。
我读到一个线程不能同时连接(或连接)到两个插座。我还读到,select
模块的使用可能有助于解决这类问题,但是我从未使用过,并且对它在特定情况下的使用有些丢失。
解决此问题的更有效方法是什么?在我的特殊情况下,如何设置select
?将流发送到子线程和请求向另一个?在
使用select
时,您必须测试,您的两个插座中的哪一个已准备好:
def run(self):
while True:
ready, _, _ = select.select([self.MainSock, self.RequestSock],[],[])
for sock in ready:
if sock is self.MainSock:
send_message_continuously(sock.accept())
elif sock is self.RequestSock:
recv_a_message_from_client(sock.accept())
我建议您尝试gevent,简单地将API放弃,如果您想克服问题,就可以去吧,有一个有关服务器的部分了解TCP Communication&重新考虑您当前的解决方案。
代码快照 -
def handle(socket, address):
print('new connection!')
server = StreamServer(('127.0.0.1', 1234), handle) # creates a new server
server.start() # start accepting new connections
希望您可以在不制作Skelt的情况下花费更多的时间来制作应用程序。:)