在前端JS中使用WebSocket与服务器通讯如下
var ws = new WebSocket("ws://127.0.0.1:8000/websocket"); // 新建一个ws连接
ws.onopen = function() { // 连接建立好后的回调
ws.send("Hello, world"); // 向建立的连接发送消息
};
ws.onmessage = function (evt) { // 收到服务器发送的消息后执行的回调
alert(evt.data); // 接收的消息内容在事件参数evt的data属性中
};
前端完整代码
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>聊天室</title>
<style>
body,ul,li{
margin: 0;
padding: 0;
list-style: none;
}
#box{
width:800px;
margin: auto;
}
#con{
height: 400px;
width: 100%;
background-color: aqua;
overflow-x: scroll;
border-radius: 20px;
}
.page_con>li{
height: 30px;
text-align: left;
line-height: 30px;
margin-left:10px;
margin-top:10px;
}
#send_message{
height: 60px;
width: 99%;
resize: none;
margin-top: 10px;
font-size: 20px;
border: 1px dotted red;
}
button{
border: none;
width: 50px;
height: 30px;
float: right;
border-radius: 10px;
color:aqua;
}
</style>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
<div id="box">
<div id="top">
<h1>Lucky在线聊天室</h1>
</div>
<div id="con">
<ul class="page_con">
</ul>
</div>
<textarea name="" id="send_message" cols="30" rows="10"></textarea>
<button type="button" onclick="sendMsg()">发送</button>
</div>
<script type="text/javascript">
var ws = new WebSocket("ws://127.0.0.1:8000/chat");
function sendMsg() {
var msg = $("#send_message").val();
ws.send(msg);
$("#send_message").val("");
}
ws.onmessage = function(e) {
$(".page_con").append("<li>" + e.data + "</li>");
}
</script>
</body>
</html>
server.py
<span class="hljs-keyword">import</span> tornado.web
<span class="hljs-keyword">import</span> tornado.ioloop
<span class="hljs-keyword">import</span> tornado.httpserver
<span class="hljs-keyword">import</span> tornado.options
<span class="hljs-keyword">import</span> os
<span class="hljs-keyword">import</span> datetime
<span class="hljs-keyword">from</span> tornado.web <span class="hljs-keyword">import</span> RequestHandler
<span class="hljs-keyword">from</span> tornado.options <span class="hljs-keyword">import</span> define, options
<span class="hljs-keyword">from</span> tornado.websocket <span class="hljs-keyword">import</span> WebSocketHandler
define(<span class="hljs-string">"port"</span>, default=<span class="hljs-number">8000</span>, type=int)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">IndexHandler</span><span class="hljs-params">(RequestHandler)</span>:</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get</span><span class="hljs-params">(self)</span>:</span>
self.render(<span class="hljs-string">"index.html"</span>)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ChatHandler</span><span class="hljs-params">(WebSocketHandler)</span>:</span>
users = set() <span class="hljs-comment"># 用来存放在线用户的容器</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">open</span><span class="hljs-params">(self)</span>:</span>
self.users.add(self) <span class="hljs-comment"># 建立连接后添加用户到容器中</span>
<span class="hljs-keyword">for</span> u <span class="hljs-keyword">in</span> self.users: <span class="hljs-comment"># 向已在线用户发送消息</span>
u.write_message(<span class="hljs-string">u"[%s]-[%s]-进入聊天室"</span> % (self.request.remote_ip, datetime.datetime.now().strftime(<span class="hljs-string">"%Y-%m-%d %H:%M:%S"</span>)))
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">on_message</span><span class="hljs-params">(self, message)</span>:</span>
<span class="hljs-keyword">for</span> u <span class="hljs-keyword">in</span> self.users: <span class="hljs-comment"># 向在线用户广播消息</span>
u.write_message(<span class="hljs-string">u"[%s]-[%s]-说:%s"</span> % (self.request.remote_ip, datetime.datetime.now().strftime(<span class="hljs-string">"%Y-%m-%d %H:%M:%S"</span>), message))
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">on_close</span><span class="hljs-params">(self)</span>:</span>
self.users.remove(self) <span class="hljs-comment"># 用户关闭连接后从容器中移除用户</span>
<span class="hljs-keyword">for</span> u <span class="hljs-keyword">in</span> self.users:
u.write_message(<span class="hljs-string">u"[%s]-[%s]-离开聊天室"</span> % (self.request.remote_ip, datetime.datetime.now().strftime(<span class="hljs-string">"%Y-%m-%d %H:%M:%S"</span>)))
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">check_origin</span><span class="hljs-params">(self, origin)</span>:</span>
<span class="hljs-keyword">return</span> <span class="hljs-keyword">True</span> <span class="hljs-comment"># 允许WebSocket的跨域请求</span>
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:
tornado.options.parse_command_line()
app = tornado.web.Application([
(<span class="hljs-string">r"/"</span>, IndexHandler),
(<span class="hljs-string">r"/chat"</span>, ChatHandler),
],
static_path = os.path.join(os.path.dirname(__file__), <span class="hljs-string">"static"</span>),
template_path = os.path.join(os.path.dirname(__file__), <span class="hljs-string">"template"</span>),
debug = <span class="hljs-keyword">True</span>
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()