def on_close(self):
# When the socket is closed, deregister the websocket with
# the FigureManager.
manager = self.application.manager
manager.remove_web_socket(self)
python类websocket()的实例源码
def on_message(self, message):
# The 'supports_binary' message is relevant to the
# websocket itself. The other messages get passed along
# to matplotlib as-is.
# Every message has a "type" and a "figure_id".
message = json.loads(message)
if message['type'] == 'supports_binary':
self.supports_binary = message['value']
else:
manager = self.application.manager
manager.handle_json(message)
def __init__(self):
# Browser websocket connections for receiving the binary audio data:
self.clients = []
# Browser websocket connections for receiving the event data:
self.eventclients = []
self.payload = None # The buffered PCM frames into 200ms WAV file
self.count = 0 # How many PCM frames I have in the buffer
self.vapi_call_uuid = None
self.vapi_connected = False
def connect_vapi(self):
logging.info("Instructing VAPI to connect")
response = client.create_call({'to': [{
"type": "websocket",
"uri": "ws://{host}/socket".format(host=CONFIG.host),
"content-type": "audio/l16;rate=16000",
"headers": {
"app": "audiosocket"
}
}],
'from': {'type': 'phone', 'number': CONFIG.phone_number},
'answer_url': ['https://{host}/ncco'.format(host=CONFIG.host)]})
logging.debug(repr(response))
self.vapi_connected = True
return True
def initialize(self, websocket):
"""
Called when class initialization, makes a link between a :class:`~tornado_websockets.websocket.WebSocket`
instance and this object.
:param websocket: instance of WebSocket.
:type websocket: WebSocket
"""
# Make a link between a WebSocket instance and this object
self.websocket = websocket
websocket.handlers.append(self)
def open(self):
"""
Called when the WebSocket is opened
"""
for event in self.websocket.events:
if event.endswith('open'):
self.on_message('{"event": "%s", "data": {}}' % event)
def on_message(self, message):
"""
Handle incoming messages on the WebSocket.
:param message: JSON string
:type message: str
"""
try:
message = tornado.escape.json_decode(message)
event = message.get('event')
data = message.get('data')
except ValueError:
self.emit_warning('Invalid JSON was sent.')
return
if not event:
self.emit_warning('There is no event in this JSON.')
return
if not self.websocket.events.get(event):
return
if not data:
data = {}
elif not isinstance(data, dict):
self.emit_warning('The data should be a dictionary.')
return
callback = self.websocket.events.get(event)
spec = inspect.getargspec(callback)
kwargs = {}
if 'self' in spec.args:
kwargs['self'] = self.websocket.context
if 'socket' in spec.args:
kwargs['socket'] = self
if 'data' in spec.args:
kwargs['data'] = data
return callback(**kwargs)
def on_close(self):
"""
Called when the WebSocket is closed, delete the link between this object and its WebSocket.
"""
self.websocket.handlers.remove(self)
def require_auth(role='user'):
def _deco(func):
def _deco2(request, *args, **kwargs):
if request.get_cookie('sessionid'):
session_key = request.get_cookie('sessionid')
else:
session_key = request.get_argument('sessionid', '')
logger.debug('Websocket: session_key: %s' % session_key)
if session_key:
session = get_object(Session, session_key=session_key)
logger.debug('Websocket: session: %s' % session)
if session and datetime.datetime.now() < session.expire_date:
user_id = session.get_decoded().get('_auth_user_id')
request.user_id = user_id
user = get_object(User, id=user_id)
if user:
logger.debug('Websocket: user [ %s ] request websocket' % user.username)
request.user = user
if role == 'admin':
if user.role in ['SU', 'GA']:
return func(request, *args, **kwargs)
logger.debug('Websocket: user [ %s ] is not admin.' % user.username)
else:
return func(request, *args, **kwargs)
else:
logger.debug('Websocket: session expired: %s' % session_key)
try:
request.close()
except AttributeError:
pass
logger.warning('Websocket: Request auth failed.')
return _deco2
return _deco
def on_message(self, message):
"""Handle a message received on the websocket."""
cmd = self.unpack(message)
try:
CommandMessage.verify(cmd)
self._on_command(cmd)
except ValidationError:
if 'operation' in cmd:
self.logger.exception("Invalid operation received: %s", cmd['operation'])
self.send_error('message did not correspond with a known schema')
def send_response(self, success, obj):
"""Send a response back to someone."""
resp_object = {'type': 'response', 'success': success}
if obj is not None:
resp_object['payload'] = obj
msg = msgpack.packb(resp_object, default=self.encode_datetime)
self.logger.debug("Sending response: %s", obj)
try:
self.write_message(msg, binary=True)
except tornado.websocket.WebSocketClosedError:
pass
def send_error(self, reason):
"""Send an error to someone."""
msg = msgpack.packb({'type': 'response', 'success': False, 'reason': reason})
try:
self.logger.debug("Sending error: %s", reason)
self.write_message(msg, binary=True)
except tornado.websocket.WebSocketClosedError:
pass
def test_ws_1():
client = yield tornado.websocket.websocket_connect("ws://localhost:8888/")
for i in range (10):
client.write_message('1')
msg = yield client.read_message()
print msg
def test_ws_2():
client = yield tornado.websocket.websocket_connect("ws://localhost:8888/")
for i in range (10):
client.write_message('2')
msg = yield client.read_message()
print msg
def define_log_pre_format_hooks(self):
"""
adds a hook to send to websocket if the run command was selected
"""
hooks = super(Server, self).define_log_pre_format_hooks()
# NOTE enabling logs only on debug mode
if self.args.func == self.run and self.args.debug:
hooks.append(self._send_log_to_ws)
return hooks
def on_close(self):
log.debug("~~ websocket close")
def writetldirs(handler):
mydirs=gettldirs(timelapsedir)
content=[]
for item in mydirs:
fcount = len([name for name in os.listdir(item) if os.path.isfile(os.path.join(item,name))])
totsize = helpers.bytes2human(sum(os.path.getsize(os.path.join(item,name)) for name in os.listdir(item) if os.path.isfile(os.path.join(item,name))))
if not fcount == 0:
thumbnail=sorted([ name for name in os.listdir(item) if os.path.isfile(os.path.join(item,name))])[-1]
else:
thumbnail="../../images/nocam.png"
info = {
"directory": item,
"count": fcount,
"size": totsize,
"thumbnail": thumbnail,
}
content.append(info)
handler.write(json.dumps({"info": content}))
#webserver------------------------------------------------------------------------------------------------------------
#WebsocketHandler HTML5 and other websocket capable clients