我正在尝试通过websocket与服务器通信。我使用websocket库和Python 3
这是处理websocket的代码:
import websocket
import threading
class SubscriptionClient:
def __init__(self,stream_name,uri,on_message=None,**kwargs):
self.stream_unique_name = stream_name
self.uri = uri
self.ws = None
self.on_message_func = on_message
self.logger = get_logger('websockets',__name__)
self.logger.info('[WEBSOCKET] connecting to stream: ' + self.stream_unique_name)
self.thread = threading.Thread(target=self.websocket_initializer,args=[])
self.thread.start()
self.logger.info('[WEBSOCKET] stream: ' + self.stream_unique_name + ' is Now connected'
# self.start_heartbeat()
def on_message(self,ws,message):
if self.on_message_func:
self.on_message_func(ws,message)
else:
print('ws:',message)
def on_error(self,error):
print('error',error)
def on_close(self,ws):
self.logger.info('[WEBSOCKET] stream: ' + self.stream_unique_name + ' closed')
print("### closed ###")
def on_ping(self,ping):
print('############ PING #################')
print(ping)
def websocket_initializer(self):
self.ws = websocket.WebSocketApp(self.uri,on_message=lambda ws,msg: self.on_message(ws,msg),on_error=lambda ws,error: self.on_error(ws,error),on_close=lambda ws: self.on_close(ws),on_ping=lambda ws,ping: self.on_ping(ws,ping)
)
self.ws.run_forever()
def start_heartbeat(self):
threading.Timer(60.0,self.start_heartbeat).start()
self.ws.send('heartbeat'.encode('utf-8'))
当我在本地PC上运行此代码时,它可以正常工作,但是在EC2 AWS生产服务器上运行它时,我设法成功连接,大约10分钟后,我从网络套接字收到此消息error [Errno 104] Connection reset by peer
。我知道为什么会这样。
我与正在连接的网站进行了交谈,他们说这可能是防火墙配置,但是当我在AWS实例中运行此命令systemctl list-unit-files | grep fire
时,我什么都没发现。
即使我要捕获此错误并按照here中的说明重新连接到服务器,似乎我必须捕获此错误的唯一方法是比较字符串,这似乎不是正确的解决方案。 (我提醒您,我在on_error
函数中收到错误,并且由于某种原因,它似乎给了我error
作为字符串)。
有人知道这里发生了什么吗?为什么它在我的本地PC上可以正常运行,但是在生产服务器上却无法运行?!