websocket 二合一
server
from flask import Flask, request, render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket
import json
app = Flask(__name__) user_socket_dict = {} # 字典 @app.route('/conn_ws/<user_nick>') #http 协议,
def ws_app(user_nick): user_socket = request.environ.get('wsgi.websocket') #type:WebSocket
user_socket_dict[user_nick] = user_socket # { 昵称:user信息 }
print(len(user_socket_dict), list(user_socket_dict.keys())) while True: # user_socket 是一个内存地址
msg = user_socket.receive() # hang 住了
msg_dict = json.loads(msg) to_user = msg_dict.get('to_user')
if to_user == 'all':
for ss in list(user_socket_dict.values()):
ss.send(msg) else: to_user_socket = user_socket_dict.get(to_user)
to_user_socket.send(msg) @app.route('/')
def index():
return render_template('my_ws.html') if __name__ == '__main__':
# app.run()
http_ser = WSGIServer(('0.0.0.0',9009),app,handler_class=WebSocketHandler) # 应用程序网关接口
http_ser.serve_forever()
页面 html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>单聊</title>
</head>
<body>
<p><input type="text" id="nick">
<button onclick="login()">登陆聊天室</button>
</p> 发送给: <input type="text" id="to_user" placeholder="找谁聊?"> 消息: <input type="text" id="send_str"> <button id="sin_btn" onclick="sin_send()">发消息</button>
<button id="send_btn" onclick="send()">群聊发消息</button> <p>
<div id="chat_list">
</div>
</p> </body>
<script type="text/javascript">
var ws = null; //公共变量, function login() {
var nick = document.getElementById('nick').value;
ws = new WebSocket('ws://192.168.11.94:9009/conn_ws/' + nick); //登录时候创建连接
ws.onmessage = function (messageEvent) { //等待消息
console.log(messageEvent.data);
var ptag = document.createElement('p');
var message = JSON.parse(messageEvent.data); ptag.innerText = message.from_user + ' : ' + message.message;
document.getElementById('chat_list').appendChild(ptag);
};
} function send() {
var message = document.getElementById('send_str').value;
var send_str = {
from_user: document.getElementById('nick').value,
// to_user:document.getElementById('to_user').value,
to_user: 'all', // 群聊
message: message
};
var json_str = JSON.stringify(send_str);
ws.send(json_str);
} function sin_send() {
var message = document.getElementById('send_str').value;
var send_str = {
from_user: document.getElementById('nick').value,
to_user:document.getElementById('to_user').value, message: message
};
var json_str = JSON.stringify(send_str);
ws.send(json_str);
} // js代码是异步代码;
</script>
</html>
websocket 二合一的更多相关文章
- 【老司机经验】CC2530&STM8S105二合一嵌入式学习板设计思路与经验分享
CC2530&STM8S105二合一嵌入式学习板设计思路与经验分享 1.缘起 这些年来一直在其他公司的实验箱和别人的开发板上进行教学与开发工作,总是觉得功能设计不那么合意.心里突然冒出个 ...
- mobile_轮播图_transform 版本_transform 读写二合一
轮播图_transform 版本 关键点: 2D 变换 transform 不会改变 元素 在 文档流 中的位置 定位 position 会改变 元素 在 文档流 中的位置 语句解析太快,使用 set ...
- 插入数据返回自增id及插入更新二合一
原文https://blog.csdn.net/dumzp13/article/details/50984413 JDBC: con.setAutoCommit(false); String sql ...
- 【洛谷2468】[SDOI2010] 粟粟的书架(二合一)
点此看题面 大致题意: 问你选取一个矩形区间内至少几个数,才能使它们的和\(\ge H_i\). 二合一 根据数据范围,比较显然能看出它是一道二合一的题目. 对于第一种情况,\(R,C\le 200\ ...
- 一步一步学WebSocket(二) 使用SuperWebSocket实现自己的服务端
上一篇文章,我们了解了客户端如何与服务器创建WebSocket连接.但是一个巴掌拍不响,既然是通信,就必然最少要有两个端.今天我们来看看c#如何用已有的框架实现一个WebSocket服务端. 在.Ne ...
- 学习WebSocket(二):使用Spring WebSocket做一个简单聊天室
聊天室高频率.低延时完全符合websocket的特点,所以聊天室使用websocket再适合不过了. 聊天室的功能并没有比上一节代码多多少,主要在握手阶段对用户的session做处理,对用户的消息进行 ...
- websocket(二)--简单实现网页版群聊
websocket可以实现服务端的消息推送,而不必在客户端轮询,大大的节省的资源,对于实时通讯来说简直是个大喜讯. 在上一篇文章中介绍了协议握手,这篇文章将通过实现简单的群聊来帮助进一步了解webso ...
- websocket(二)——基于node js 的同步聊天应用
https://github.com/sitegui/nodejs-websocket 1.用node搭建本地服务 npm install nodejs-websocket var ws = re ...
- 注册登录二合一之bootstrap
来源 https://bootsnipp.com/snippets/featured/login-and-register-tabbed-form jquery插件 需导入bootstrap插件 这个 ...
随机推荐
- adsas数据库去O记
adsas 数据库是用于广告买量数据分析;在17年由 Oracle 迁移到 PostgreSQL.现把之前的迁移笔记整理下.本次迁移表91个:存储过程21个:数据库大小2G. 1. 准备Postgre ...
- 基于ARM9和嵌入式Linux系统的多功能综合通信控制系统的框架
基于ARM9硬件平台和嵌入式Linux系统的多功能综合通信控制系统的框架设计及各模块的功能.系统采用符合POSIX.1标准的C语言编写,实现了对下位机传送数据帧的采集.分析和存储,并能根据上位机的配置 ...
- Windows下Codeblocks调试Cocos2d-x项目体验(一次失败的体验)
很久之前的一篇文章有介绍过在Ubuntu下安装Cocos2d-x3.11并使用Codeblock调试Cocos2d-x程序:http://www.cnblogs.com/moonlightpoet/p ...
- 10.30 rest_framework总结
2018-10-30 20:25:23 终于学完了rest_framework 这个框架! 这个框架有一些基本组件!最重要的就是看源码!要一个类一个类的去找!按顺序! 并且要自己配置类的时候要先看源 ...
- Solve Error: Library not loaded: @rpath/RoutingHTTPServer.framework/RoutingHTTPServer
在配置WebDriverAgent的时候,可能会遇到如下的错误: 2018-01-04 09:53:42.759370-0600 WebDriverAgentRunner-Runner[318:133 ...
- UCloud 机房的网络搭建(计蒜客初赛第五场)
UCloud 刚刚建立一个新机房,近日正在进行网络搭建.机房内有 nn 台服务器和 mm 个分线器,整个机房只有一个网线出口.分线器的作用是将一根网线转换成多根网线.蒜头君也知道每个分线器输出的最大网 ...
- express.js graphql express-graphql
文档 创建应用 const l = console.log; var express = require("express"); var graphqlHTTP = require ...
- yarn集群客户端gateway常用限制
spark默认集群模式,省略上传依赖包过程:spark-default.sh spark.yarn.jars hdfs:///${PATH}/sparkJar/jars/*.jarspark.subm ...
- Spring-Boot构建多模块项目
Spring-Boot构建多模块项目 功能模块单独项目开发,可以将一个庞大的项目分解成多个小项目,便于细分开发 Maven多模块项目不能独立存在,必须有一个介质来包含. 1.创建一个Maven 项目, ...
- 基于 ASP.NET Core 2.1 的 Razor Class Library 实现自定义错误页面的公用类库
注意:文中使用的是 razor pages ,建议使用 razor views ,使用 razor pages 有一个小坑,razor pages 会用到 {page} 路由参数,如果应用中也用到了这 ...