Skip to content
This repository
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

file 84 lines (66 sloc) 2.743 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
###############################################################################
##
## Copyright 2011,2012 Tavendo GmbH
##
## Licensed under the Apache License, Version 2.0 (the "License");
## you may not use this file except in compliance with the License.
## You may obtain a copy of the License at
##
## http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS,
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## See the License for the specific language governing permissions and
## limitations under the License.
##
###############################################################################

import sys, os
from twisted.python import log
from twisted.internet import reactor
from autobahn.websocket import WebSocketClientFactory, \
                               WebSocketClientProtocol, \
                               connectWS

from autobahn.wamp import WampClientFactory, WampClientProtocol
from autobahn.util import utcnow, parseutc, newid

import datetime

# use WAMP base class, even though we won't use WAMP features
# but only plain WS Ping/Pong.
# reason: be able to test against our WS server on the net.
# which only wants to speak WAMP .. ha.

#class HeartbeatClientProtocol(WebSocketClientProtocol):
class HeartbeatClientProtocol(WampClientProtocol):

   BEAT_SIZE = 100
   BEATS_PER_SEC = 5

   def sendBeat(self):
      id = newid()
      payload = os.urandom(HeartbeatClientProtocol.BEAT_SIZE)
      self.beats[id] = datetime.datetime.utcnow()
      self.sendPing(id + payload)
      print "Sent heartbeat: " + id, self.beatsize
      reactor.callLater(1./float(HeartbeatClientProtocol.BEATS_PER_SEC), self.sendBeat)

   def onOpen(self):
      self.beats = {}
      self.beatsize = 100
      self.sendBeat()

   def onPong(self, payload):
      id = payload[:16]
      l = len(payload) - 16
      now = datetime.datetime.utcnow()

      if self.beats.has_key(id):
         rtt_ms = (now - self.beats[id]).total_seconds() * 1000.
         print "Got heartbeat: " + id, l, rtt_ms



if __name__ == '__main__':

   if len(sys.argv) < 2:
      print "Need the WebSocket server address, i.e. ws://localhost:9000"
      sys.exit(1)

   log.startLogging(sys.stdout)

   debug = False

   #factory = WebSocketClientFactory(sys.argv[1], debug = True, debugCodePaths = True)
   factory = WampClientFactory(sys.argv[1],
                               debug = debug,
                               debugCodePaths = True,
                               debugWamp = debug)
   factory.protocol = HeartbeatClientProtocol
   connectWS(factory)

   reactor.run()
Something went wrong with that request. Please try again.