项目地址:https://github.com/CzaOrz/ioco/tree/master/open_source_project/web_socket_chat
项目环境:
前端:JS环境都已经配置好了,可以直接使用
后端:python3.X,还需要安装pywss包(pywss低于0.0.9版本的有点问题,我临时修复并更新到0.0.9了,其他...):
pip install pywss==0.0.9
我们首先看下实际效果图:
首先打开两个前端,看看效果(记得开启后端服务哦):
再来看看后台:
接下来,先来看服务端代码:
server.py
from pywss import Pyws, route, json, ConnectManager @route('/ws/chat') def ws_chat(request, data): json_data = json.loads(data) if json_data.get('start') == True: # 接收start指令 # 更新所有已建立连接的socket - 当前在线人数 request.conn.send_to_all({'online': ConnectManager.online()}) return {'sock_id': request.conn.name} # 返回自身唯一sock_id msg = json_data.get('msg') if msg: # 获取聊天消息,发送给所有已建立连接的socket request.conn.send_to_all({'from': request.conn.name, 'msg': msg}) if __name__ == '__main__': ws = Pyws(__name__, address='127.0.0.1', port=8868) ws.serve_forever()
代码比较简单。主要流程就是:
1、用户建立WebSocket连接后,再由前端发送启动指令 JSON.stringify({start: true})
上述代码,由后端获取并解析,首先会更新所有已建立连接的socket的当前在线人数,也就是发送JSON:
{'online': ConnectManager.online()}
然后在返回当前用户的唯一sock_id,当然也是以JSON的形式: {'sock_id': request.conn.name}
这一步,后端一共返回了两个数据,online 和 sock_id,这些都会存储在前端。
2、前端发送聊天数据,以 JSON.stringify({msg: this.content}) 的格式发送。
后台获取并解析,然后发送给每一位连接用户,以JSON的形式: {'from': request.conn.name, 'msg': msg}
前端代码(JS部分):
client.html
$(function(){ new Vue({ el: '#ws-chat', data(){ return{ sock_id: '', content: '', online: 0, messages: [], } }, mounted(){ this.ws = new WebSocket("ws://127.0.0.1:8868/ws/chat"); this.ws.onmessage = (ev) => { json_data = JSON.parse(ev.data); if (json_data.sock_id) { // 获取唯一sock_id this.sock_id = json_data.sock_id; } else if (json_data.online) { // 更新当前在线人数 this.online = json_data.online; } else if (json_data.from) { this.messages.push(json_data); // 推送聊天消息至容器,交由Vue更新DOM $('#chat-content-list').parent().animate({ scrollTop: $('#chat-content-list').height() }, 1000); } }; this.ws.onclose = (ev) => { this.messages.push({from: 'WebSocket', msg: 'WebSocket后台服务已关闭!'}); }; this.ws.onopen = (ev) => { this.messages.push({from: 'WebSocket', msg: '欢迎来到WebSocket聊天室!'}); this.ws.send(JSON.stringify({'start': true})); }; }, methods: { ws_send: function(){ if (this.content) { this.ws.send(JSON.stringify({msg: this.content})); this.content = ''; } }, }, }); })
代码也比较简单:
1、 this.ws = new WebSocket("ws://127.0.0.1:8868/ws/chat"); 建立WebSocket连接。注意路径不要错了。
this.ws.onopen 当websocket连接建立后,会执行且仅执行一次此函数
this.ws.onclose 当websocket连接断开后,会执行且仅执行一次此函数
this.ws.onmessage 当有消息接收的时候会触发此函数
大概就先这样把,应该还挺清晰的了...