客户端代码:

# -*-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的时候回调def onConnectToServer(self, peer):pass# client断开与server的连接的时候回调def onDisConnectFromServer(self, wasClean, code, reason):pass# 收到Msg消息时回调def onMsgReceived(self, peer, data, isBinary):print('received {0} from {1}'.format(data, peer))# 保存一个与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()

服务端代码:

# -*-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连接上来的时候回调def onClientConnected(self, peer):pass# client断开连接的时候回调def onClientLostConnected(self, wasClean, code, reason):pass# 收到Msg消息时回调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的连接不存在')

启动Server:

class CommunicationTool:Server = 1Client = 0def __init__(self):self.isAutoReconnect = False# 设置创建的Server还是Clientdef setFlag(self, flag):self.flag = flag# 创建serverdef createServer(self, addr, port):# 先判断创建的类型if self._isServer():if isinstance(addr, str) and isinstance(port, int):self.addr = addrself.port = portelse:raise Exception('createServer的参数类型有误')else:raise Exception('不支持client类型执行此方法')def startListen(self):# 先判断必填参数是否都填了if self._isServer():if self.serverProtocol is None:raise Exception('未设置protocol')if self.serverFactory is None:raise Exception('未设置factory')if self.addr is None or self.port is None:raise Exception('未设置createServer')else:raise Exception('未设置flag或不支持此方法')# 开启服务器,应该在子线程中一直运行# 调用父类的startListen方法,将数据传入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()# 设置是否自动断线重连def setAutoReconnect(self, isAutoReconnect):if isinstance(isAutoReconnect, bool):self.isAutoReconnect = isAutoReconnectelse:raise Exception('参数类型错误')def setServerProtocol(self, protocol):if self._isServer():self.serverProtocol = protocolelse:raise Exception('Client类型不能调用此方法')def setServerFactory(self, factory):if self._isServer():self.serverFactory = factoryelse:raise Exception('Client类型不能调用此方法')def _isServer(self):if self.flag == self.Server:return Trueif self.flag == self.Client:return Falseelse:raise Exception('未设置flag')if __name__ == '__main__':cTool = CommunicationTool() # 传入webSocket的地址cTool.setFlag(CommunicationTool.Server) # 设置类型cTool.setServerProtocol(BaseSipServerProtocol)factory = BaseSipServerFactory(u"ws://127.0.0.1:9009")cTool.setServerFactory(factory)factory.setProtocolOptions(autoPingInterval=5)cTool.setAutoReconnect(True) # 设置是否自动断线重连cTool.createServer('0.0.0.0', 9009) # 创建servercTool.startListen() # 开启server监听

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

  1. 树莓派python实例_使用Python实现树莓派WiFi断线自动重连实例(附代码)

    实现 WiFi 断线自动重连,原理是用 Python 监测网络是否断线,如果断线则重启网络服务.接下来给大家分享实现代码,需要的朋友参考下 1.Python 代码 autowifi.py,放在 /ho ...

  2. python连不上树莓派_Python实现树莓派WiFi断线自动重连

    实现 WiFi 断线自动重连.原理是用 Python 监测网络是否断线,如果断线则重启网络服务. 1.Python 代码 autowifi.py,放在 /home/pi 目录下: #!/usr/bin ...

  3. 树莓派退出python的代码_Python实现树莓派WiFi断线自动重连的实例代码

    实现 WiFi 断线自动重连.原理是用 Python 监测网络是否断线,如果断线则重启网络服务. 1.Python 代码 autowifi.py,放在 /home/pi 目录下: #!/usr/bin ...

  4. python断网重联_Python实现WiFi断线自动重连的方法详解

    实现 WiFi 断线自动重连,原理是用 Python 监测网络是否断线,如果断线则重启网络服务.接下来给大家分享实现代码,需要的朋友参考下 1.Python 代码 autowifi.py,放在 /ho ...

  5. python攻击某个wifi设备使断网_Python实现WiFi断线自动重连的方法详解

    实现 WiFi 断线自动重连,原理是用 Python 监测网络是否断线,如果断线则重启网络服务.接下来给大家分享实现代码,需要的朋友参考下 1.Python 代码 autowifi.py,放在 /ho ...

  6. linux 模块 掉线重拨,arm中实现pppd连接GPRS上网的相关笔记,含GPRS自动拨号脚本(真正的实时监控,断线自动重拨)...

    在嵌入式Linux下GPRS上网方案 笔记1 硬/软件环境 基于S3C2410的嵌入式系统,COM1连接PC,COM2连接SIM300 GPRS模块. 该系统运行在Linux 2.6.14操作系统下, ...

  7. 海盗王客户端断线自动重连的解决方案

    相信很多人,在玩海盗王online的时候,深受客户端断线的困扰. 有时候,晚上睡觉或者外出的时候,开几个号挂机.结果,由于网络不稳定,网络时有断线的故障,造成游戏断线,毫无收获不说,还浪费电费. 于是 ...

  8. Windows下使用任务计划程序实现宽带开机自动拨号和断线自动重连

    由于学校网络改造,我们告别了客户端登录的锐捷,迎来了PPPoE拨号的深澜,本以为新的认证计费系统能带来更好的体验,结果偏偏在很基础的功能上出问题,诸如macOS下拨号没有IPv6地址.高峰期卡成狗.不 ...

  9. linux自动拨号脚本,arm中实现pppd连接GPRS上网的相关笔记,含GPRS自动拨号脚本(真正的实时监控,断线自动重拨)...

    在嵌入式Linux下GPRS上网方案 笔记1 硬/软件环境 基于S3C2410的嵌入式系统,COM1连接PC,COM2连接SIM300 GPRS模块. 该系统运行在Linux 2.6.14操作系统下, ...

最新文章

  1. python3 pyquery模块 解析html网页
  2. 你需要掌握的三种编程语言
  3. B题 锅炉水冷壁温度曲线 2021年第一届长三角高校数学建模竞赛
  4. spring bean加载过程_Spring源码剖析3:Spring IOC容器的加载过程
  5. 北京林业大学c语言题库,2016年北京林业大学信息学院数据结构考研复试题库
  6. JS组件系列——Bootstrap 树控件使用经验分享 - 懒得安分 - 博客园
  7. Linux下修改SSH登录端口
  8. 论文浅尝 - AAAI2020 | 迈向建立多语言义元知识库:用于 BabelNet Synsets 义元预测...
  9. 27岁华裔小伙搞出美国新冠最准预测模型,一人干翻专业机构,彭博:Superstar...
  10. 【练习手记】【多题合集】用树状数组做线段树练习1、2、3
  11. git 代码回滚_git代码版本管理(1)——git版本回滚
  12. 本机未装Oracle数据库时Navicat for Oracle 报错:Cannot create oci environment 原因分析及解决方案
  13. 一台计算机固定一个ip地址,两台电脑如何分享一个固定的IP地址
  14. 笔记本电池检测工具 BatteryInfoView 汉化
  15. MPB:中科院微生物所蔡磊组-​基于扩增子数据的系统发育树的构建和展示
  16. android toast居中显示_Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明...
  17. 阿里icon使用fontclass
  18. 亚马逊echo中国使用_我需要Amazon Echo才能使用Alexa吗?
  19. Anchor-based和Anchor-free优缺点对比
  20. 用户账号管理和组管理

热门文章

  1. 如何将之前push的撤回_门禁如何接线?一个实例了解清楚
  2. python智能写作_Python学习与技术博客写作的利器
  3. String,异常捕获,多线程中最容易出错的几道选择题
  4. 亚马逊运营思路是什么?新手卖家应该注意些什么问题?
  5. XCTF-MISC进阶
  6. charCodeAt 和 String.fromCharCode 用法
  7. 医疗行业AI医学影像与互联网诊疗文件存储设备解决方案
  8. Redis之Centos6安装使用及Windows客户端工具(绿色免安装版)下载
  9. c++匿名union
  10. vue cli安装贼慢解决办法