日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

autobahn-python的使用——sendMessage()和断线自动重连

發(fā)布時(shí)間:2023/12/29 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 autobahn-python的使用——sendMessage()和断线自动重连 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

客戶端代碼:

# -*-coding:utf8-*- import threading import timefrom autobahn.asyncio.websocket import WebSocketClientProtocolfrom autobahn.asyncio.websocket import WebSocketClientFactory import asyncioclass BaseSipClientProtocol(WebSocketClientProtocol):KEEPALIVE_INTERVAL = 5def check_keepalive(self):last_interval = time.time() - self.last_ping_timeif last_interval > 2 * self.KEEPALIVE_INTERVAL:# drop connectionself.dropConnection(abort=True)else:# reschedule next checkself.schedule_keepalive()def schedule_keepalive(self):""" Store the future in the class to cancel it later. """try:import asyncioexcept ImportError:# Trollius >= 0.3 was renamedimport trollius as asyncioloop = asyncio.get_event_loop()self.keepalive_fut = loop.call_later(self.KEEPALIVE_INTERVAL,self.check_keepalive)def onConnect(self, response):print("Server connected: {0}".format(response.peer))# save connection to server handle on factoryself.factory.saveConnectionToServer(self)self.onConnectToServer(response.peer)def onOpen(self):""" Start scheduling the keepalive check. """self.last_ping_time = time.time()self.schedule_keepalive()def onPing(self, payload):""" Respond to the ping request. """self.last_ping_time = time.time()self.sendPong(payload)print('Ping == ', payload)def connection_lost(self, exc):""" Cancel the scheduled future. """self.keepalive_fut.cancel()try:import asyncioexcept ImportError:# Trollius >= 0.3 was renamedimport trollius as asyncioloop = asyncio.get_event_loop()loop.stop()def onMessage(self, payload, isBinary):# 做一些處理,peer mapping msgself.onMsgReceived(self.peer, payload, isBinary)def onClose(self, wasClean, code, reason):print("WebSocket connection closed: {0}".format(reason))# remove connection to serverself.factory.delConnectionToServer()self.onDisConnectFromServer(wasClean, code, reason)# client連接上server的時(shí)候回調(diào)def onConnectToServer(self, peer):pass# client斷開與server的連接的時(shí)候回調(diào)def onDisConnectFromServer(self, wasClean, code, reason):pass# 收到Msg消息時(shí)回調(diào)def onMsgReceived(self, peer, data, isBinary):print('received {0} from {1}'.format(data, peer))# 保存一個(gè)與server連接的句柄 class BaseSipClientFactory(WebSocketClientFactory):_connectionToServer = None# save connection to serverdef saveConnectionToServer(self, connectedHandle):self._connectionToServer = connectedHandle# remove connection to serverdef delConnectionToServer(self):self._connectionToServer = Nonedef getConnectionToServer(self):return self._connectionToServer# support sendMsg to clientdef sendMsg(self, data):if self._connectionToServer is not None:if isinstance(data,bytes):self._connectionToServer.sendMessage(data, True)else:self._connectionToServer.sendMessage(data.encode('utf-8'))else:raise Exception('與server的連接不存在')if __name__ == '__main__':try:import asyncioexcept ImportError:# Trollius >= 0.3 was renamedimport trollius as asynciofactory = BaseSipClientFactory(u"ws://192.168.88.3:9009")factory.protocol = BaseSipClientProtocolloop = asyncio.get_event_loop()while True:fut = loop.create_connection(factory, '192.168.88.3', 9009)try:transport, protocol = loop.run_until_complete(asyncio.wait_for(fut, 5))loop.run_forever()except asyncio.TimeoutError:print('TimeoutError')continueexcept OSError as err:print('OSError == ' + str(err))# a little timeout before trying againloop.run_until_complete(asyncio.sleep(5))loop.close()

服務(wù)端代碼:

# -*-coding:utf8-*- from autobahn.asyncio.websocket import WebSocketServerFactoryfrom autobahn.asyncio.websocket import WebSocketServerProtocolclass BaseSipServerProtocol(WebSocketServerProtocol):def onConnect(self, request):print("Client connecting: {0}".format(request.peer))# save connection in factory _connectionSetsself.factory.addConnection(request.peer, self)self.onClientConnected(request.peer)def onOpen(self):print("WebSocket connection open.")def onMessage(self, payload, isBinary):# 做一些處理,peer mapping msgself.onMsgReceived(self.peer, payload, isBinary)def onClose(self, wasClean, code, reason):print("WebSocket connection closed: {0}".format(reason))# remove connection from factory _connectionSetsself.factory.removeConnection(self)self.onClientLostConnected(wasClean, code, reason)# client連接上來的時(shí)候回調(diào)def onClientConnected(self, peer):pass# client斷開連接的時(shí)候回調(diào)def onClientLostConnected(self, wasClean, code, reason):pass# 收到Msg消息時(shí)回調(diào)def onMsgReceived(self, peer, data, isBinary):print('received {0} from {1}'.format(data, peer))class BaseSipServerFactory(WebSocketServerFactory):_connectionSets = dict()# save connectiondef addConnection(self, peer, connectedHandle):self._connectionSets.setdefault(peer, connectedHandle)# remove connectiondef removeConnection(self, connectedHandle):removePeer = Nonefor k, v in self._connectionSets.items():if v == connectedHandle:removePeer = kbreakif removePeer is not None:del self._connectionSets[removePeer]def getConnectionByPeer(self, peer):return self._connectionSets.get(peer)def getConnections(self):return self._connectionSets# support sendMsg to clientdef sendMsg(self, peer, data):connectedHandle = self.getConnectionByPeer(peer)if connectedHandle is not None:if isinstance(data,bytes):connectedHandle.sendMessage(data, True)else:connectedHandle.sendMessage(data.encode('utf-8'))else:raise Exception('peer的連接不存在')

啟動(dòng)Server:

class CommunicationTool:Server = 1Client = 0def __init__(self):self.isAutoReconnect = False# 設(shè)置創(chuàng)建的Server還是Clientdef setFlag(self, flag):self.flag = flag# 創(chuàng)建serverdef createServer(self, addr, port):# 先判斷創(chuàng)建的類型if self._isServer():if isinstance(addr, str) and isinstance(port, int):self.addr = addrself.port = portelse:raise Exception('createServer的參數(shù)類型有誤')else:raise Exception('不支持client類型執(zhí)行此方法')def startListen(self):# 先判斷必填參數(shù)是否都填了if self._isServer():if self.serverProtocol is None:raise Exception('未設(shè)置protocol')if self.serverFactory is None:raise Exception('未設(shè)置factory')if self.addr is None or self.port is None:raise Exception('未設(shè)置createServer')else:raise Exception('未設(shè)置flag或不支持此方法')# 開啟服務(wù)器,應(yīng)該在子線程中一直運(yùn)行# 調(diào)用父類的startListen方法,將數(shù)據(jù)傳入factory = self.serverFactoryfactory.protocol = self.serverProtocolif self.isAutoReconnect: # set auto-reconnectionfactory.setProtocolOptions(autoPingInterval=5, autoPingTimeout=2)loop = asyncio.get_event_loop()coro = loop.create_server(factory, self.addr, self.port)server = loop.run_until_complete(coro)serverThread = threading.Thread(target=self._run, args=(loop, server), name='serverThread')serverThread.start()def _run(self, loop, server):try:loop.run_forever()except KeyboardInterrupt:passfinally:server.close()loop.close()# 設(shè)置是否自動(dòng)斷線重連def setAutoReconnect(self, isAutoReconnect):if isinstance(isAutoReconnect, bool):self.isAutoReconnect = isAutoReconnectelse:raise Exception('參數(shù)類型錯(cuò)誤')def setServerProtocol(self, protocol):if self._isServer():self.serverProtocol = protocolelse:raise Exception('Client類型不能調(diào)用此方法')def setServerFactory(self, factory):if self._isServer():self.serverFactory = factoryelse:raise Exception('Client類型不能調(diào)用此方法')def _isServer(self):if self.flag == self.Server:return Trueif self.flag == self.Client:return Falseelse:raise Exception('未設(shè)置flag')if __name__ == '__main__':cTool = CommunicationTool() # 傳入webSocket的地址cTool.setFlag(CommunicationTool.Server) # 設(shè)置類型cTool.setServerProtocol(BaseSipServerProtocol)factory = BaseSipServerFactory(u"ws://127.0.0.1:9009")cTool.setServerFactory(factory)factory.setProtocolOptions(autoPingInterval=5)cTool.setAutoReconnect(True) # 設(shè)置是否自動(dòng)斷線重連cTool.createServer('0.0.0.0', 9009) # 創(chuàng)建servercTool.startListen() # 開啟server監(jiān)聽

總結(jié)

以上是生活随笔為你收集整理的autobahn-python的使用——sendMessage()和断线自动重连的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 激情网络| 国产三级全黄 | 欧美成免费 | 色七七桃花综合影院 | 99资源站 | 久久dvd| 一级网站在线观看 | 大乳女喂男人吃奶 | 欧美专区在线 | 在线观看av网 | 男男肉耽高h彩漫 | 黄色电影在线视频 | 欧美三级少妇高潮 | 日韩av综合 | 黄色日批网站 | 久久精品久久久精品美女 | 一级黄色片免费 | 素人一区 | 久久国产免费 | 欧美呦呦 | 五月天综合婷婷 | 草久久| ass极品国模人体欣赏 | 在哪里可以看毛片 | 伊人网欧美 | 草草影院地址 | 亚洲视频免费在线观看 | 国产乱码精品一区二区三区五月婷 | www.夜夜 | 合欢视频在线观看 | 主播av在线 | 国产伦子伦对白视频 | 国产91精品一区二区麻豆亚洲 | 久久精品动漫 | 神马午夜51 | 中文字幕第一页av | 荡女精品导航 | 精品美女一区 | 国产精品高潮AV无码 | 美女写真福利视频 | 香蕉视频免费在线看 | 蜜桃久久av | 国产在线三区 | 亚洲成a人片在线www | 91大神在线看 | 69av网站 | 成人欧美一区二区三区白人 | 日韩黄色av | 又粗又大又硬毛片免费看 | 国产一区二区免费电影 | 99re5| 欧美特级一级片 | 免费看欧美一级片 | 天天拍夜夜爽 | 激情久久中文字幕 | 一道本在线| 午夜性视频| 永久免费在线观看视频 | 亚洲熟妇无码一区二区三区 | 中文字幕人妻熟女在线 | 欧美日韩 一区二区三区 | 欧美特一级 | 国产123在线 | 精品少妇久久 | 亚洲高清在线观看视频 | 高清中文字幕mv的电影 | 日韩黄页网站 | 久久嫩草| 黄色av视屏| 做暧暧视频在线观看 | 日本韩国在线观看 | 国产成人福利在线 | 欧美一区日韩一区 | 国产精品久久久久久亚洲 | 激情高潮呻吟抽搐喷水 | 男人久久| a极毛片 | 老司机性视频 | 奇米影视狠狠干 | 极品91| 影音先锋人妻啪啪av资源网站 | 免费在线黄色网 | 欧美一级三级 | 香蕉视频在线观看网站 | 国产一区二区三区视频播放 | 国产在线视频不卡 | 日本黄色录像 | 91福利视频免费观看 | 老牛嫩草二区三区观影体验 | 国产自偷自拍 | 国产亚洲av片在线观看18女人 | 亚洲av永久无码精品 | 强伦轩人妻一区二区电影 | 久久精品中文字幕 | 成人在线免费视频播放 | 一区二区不卡免费视频 | www.av在线| 人成免费 | 色综合狠狠 |