{"id":23,"date":"2016-03-04T17:52:58","date_gmt":"2016-03-04T08:52:58","guid":{"rendered":"http:\/\/appw.jp\/2016\/?p=23"},"modified":"2016-10-29T15:17:35","modified_gmt":"2016-10-29T06:17:35","slug":"tornado-%e3%81%a7-secure-websocket-%e3%82%92%e8%a9%a6%e3%81%97%e3%81%be%e3%81%99","status":"publish","type":"post","link":"https:\/\/appw.jp\/2016\/?p=23","title":{"rendered":"Tornado \u3067 Secure Websocket \u3092\u8a66\u3057\u307e\u3059"},"content":{"rendered":"<pre><code>\r\nimport tornado.httpserver\r\nimport tornado.websocket\r\nimport tornado.ioloop\r\nimport tornado.web\r\n\r\nclass WSHandler(\r\n    tornado.websocket.WebSocketHandler):\r\n\r\n  def open(self):\r\n    print 'WebSocket opened.\\n'\r\n\r\n  def on_message(self, message):\r\n    print 'received message: %s\\n' %message\r\n    self.write_message(message + ' OK')\r\n\r\n  def on_close(self):\r\n    print 'WebSocket closed.\\n'\r\n\r\napplication = tornado.web.Application(\r\n    [(r'\/ws', WSHandler)])\r\n\r\nif __name__ == \"__main__\":\r\n  http_server = tornado.httpserver.HTTPServer(\r\n      application, ssl_options={\r\n          \"certfile\": \"server.cert\",\r\n          \"keyfile\":  \"server.key\"})\r\n  http_server.listen(8080)\r\n  tornado.ioloop.IOLoop.instance().start()\r\n<\/code><\/pre>\n<p>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306f\u3001websocket-client \u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u63a5\u7d9a\u3092\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<pre><code>\r\nimport sys\r\nimport ssl\r\nfrom websocket import create_connection\r\n\r\nws = create_connection(\r\n    \"wss:\/\/example.jp:8080\/ws\",\r\n    sslopt={\"cert_reqs\": ssl.CERT_NONE,\r\n            \"check_hostname\": False})\r\n \r\nif len(sys.argv) > 1:\r\n    message = sys.argv[1]\r\nelse:\r\n    message = 'hello websocket!'\r\n \r\nprint ws.send(message)\r\nprint ws.recv()\r\n \r\nws.close()\r\n<\/code><\/pre>\n<p><!--more--><\/p>\n<p><a href=\"http:\/\/www.tornadoweb.org\/en\/stable\/\">http:\/\/www.tornadoweb.org\/en\/stable\/<\/a><br \/>\n<a href=\"https:\/\/appw.jp\/2016\/files\/2016\/03\/wp-1457081450315.jpeg\"><img decoding=\"async\" title=\"wp-1457081450315\" class=\"alignnone size-full\"  alt=\"image\" src=\"https:\/\/appw.jp\/2016\/files\/2016\/03\/wp-1457081450315.jpeg\" \/><\/a> <\/p>\n<p><a href=\"https:\/\/pypi.python.org\/pypi\/websocket-client\/\">https:\/\/pypi.python.org\/pypi\/websocket-client\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tornado \u306e Websocket \u30b5\u30fc\u30d0\u306e\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u304c\u3001Google \u691c\u7d22\u3057\u307e\u3059\u3068\u3001\u305f\u3044\u3078\u3093\u591a\u304f\u307f\u3064\u304b\u308a\u307e\u3059\u3002\u305d\u308c\u3089\u3092\u53c2\u8003\u306b\u3055\u305b\u3066\u3044\u305f\u3060\u304d\u3001Secure Websocket \u63a5\u7d9a\u3092\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,4],"tags":[],"class_list":["post-23","post","type-post","status-publish","format-standard","hentry","category-python","category-websocket"],"_links":{"self":[{"href":"https:\/\/appw.jp\/2016\/index.php?rest_route=\/wp\/v2\/posts\/23","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/appw.jp\/2016\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/appw.jp\/2016\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/appw.jp\/2016\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/appw.jp\/2016\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=23"}],"version-history":[{"count":4,"href":"https:\/\/appw.jp\/2016\/index.php?rest_route=\/wp\/v2\/posts\/23\/revisions"}],"predecessor-version":[{"id":88,"href":"https:\/\/appw.jp\/2016\/index.php?rest_route=\/wp\/v2\/posts\/23\/revisions\/88"}],"wp:attachment":[{"href":"https:\/\/appw.jp\/2016\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=23"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/appw.jp\/2016\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=23"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/appw.jp\/2016\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=23"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}