websocket之简易聊天室
一,带昵称的群聊
#!/usr/bin/env python
# -*- coding:utf8 -*- import json
from flask import Flask, request, render_template
from geventwebsocket.websocket import WebSocket
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler app = Flask(__name__)
user_socket_dict = {} @app.route("/")
def index():
return render_template("index_nickname.html") @app.route("/ws/<nick_name>") # ws://127.0.0.1:8000/ws
def ws(nick_name):
# print(request.environ)
# print(request.environ.get("wsgi.websocket"))
# 链接 <geventwebsocket.websocket.WebSocket object at 0x000001A7380D0C78>
user_socket = request.environ.get("wsgi.websocket") # type:WebSocket # 写上这个,代码可以有提示
if user_socket:
user_socket_dict[nick_name] = user_socket
else:
return render_template("index.html", msg="请使用web_socket链接")
while 1:
msg = user_socket.receive()
for user_name, u_socket in user_socket_dict.items(): # type:WebSocket
if user_socket != u_socket: # 不给自己发消息
try:
u_socket.send(json.dumps({"nick_name": nick_name, "msg": msg})) # 发送人是
except Exception as e:
continue if __name__ == '__main__':
http_server = WSGIServer(("127.0.0.1", 8000), app, handler_class=WebSocketHandler)
# 使用WSGIServer,而不是flask自带的werkzeug,处理, 如果本次请求是ws开头的,就交给WebSocketHandler
# 处理数据(给environ中添加websocket相关的键值对),处理完之后交给app
http_server.serve_forever()
# app.run()
templates:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ msg }}
<h1>群P开始了</h1>
输入你的昵称:<input type="text" id="nick_name">
<button onclick="createWebsocket()">链接群聊</button> 编辑消息:<input type="text" id="msg_s">
<button onclick="send_msg()">发送</button>
<div style="border: 2px solid; width: 500px;height: 800px;" id="text_div"> </div> <script>
var ws = "";
var text_div = document.getElementById("text_div");
var nickName = "";
function createWebsocket() {
let nick_name = document.getElementById("nick_name").value;
nickName = nick_name;
let w_s = new WebSocket("ws://127.0.0.1:8000/ws/" + nickName); // 把名称当作url参数发过去
ws = w_s;
console.log("ws://127.0.0.1:8000/ws/" + nickName);
ws.onmessage = function (data) {
var obj_data = JSON.parse(data.data);
console.log(data.data);
var p_ele = '<p>'+ obj_data.nick_name + ':'+ obj_data.msg +'</p>';
text_div.innerHTML += p_ele
}} function send_msg() {
var msg_s = document.getElementById("msg_s").value;
let p_ele_s = "<p style='text-align: right'>" + msg_s + ':' + nickName + "</p>";
text_div.innerHTML += p_ele_s;
ws.send(msg_s);
}
</script>
</body>
</html>
二,带昵称的单聊
#!/usr/bin/env python
# -*- coding:utf8 -*- import json
from flask import Flask, request, render_template
from geventwebsocket.websocket import WebSocket
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler app = Flask(__name__)
user_socket_dict = {} @app.route("/")
def index():
return render_template("index_nickname_danren.html") @app.route("/ws/<nick_name>") # ws://127.0.0.1:8000/ws
def ws(nick_name):
# print(request.environ)
# print(request.environ.get("wsgi.websocket"))
# 链接 <geventwebsocket.websocket.WebSocket object at 0x000001A7380D0C78>
user_socket = request.environ.get("wsgi.websocket") # type:WebSocket # 写上这个,代码可以有提示
if user_socket:
user_socket_dict[nick_name] = user_socket
else:
return render_template("index.html", msg="请使用web_socket链接")
while 1:
msg = user_socket.receive()
msg_dict = json.loads(msg)
to_user = msg_dict.get('to_user')
msg = msg_dict.get("msg")
to_user_socket = user_socket_dict.get(to_user) # type:WebSocket
to_user_socket.send(json.dumps({"nick_name": nick_name, "msg": msg})) if __name__ == '__main__':
http_server = WSGIServer(("127.0.0.1", 8000), app, handler_class=WebSocketHandler)
# 使用WSGIServer,而不是flask自带的werkzeug,处理, 如果本次请求是ws开头的,就交给WebSocketHandler
# 处理数据(给environ中添加websocket相关的键值对),处理完之后交给app
http_server.serve_forever()
# app.run()
templates:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ msg }}
<h1>群P开始了</h1>
输入你的昵称:<input type="text" id="nick_name">
<button onclick="createWebsocket()">链接群聊</button> <p>与:<input type="text" id="to_user">轻声细语</p> 编辑消息:<input type="text" id="msg_s">
<button onclick="send_msg()">发送</button>
<div style="border: 2px solid; width: 500px;height: 800px;" id="text_div"> </div> <script>
var ws = "";
var text_div = document.getElementById("text_div");
var nickName = "";
function createWebsocket() {
let nick_name = document.getElementById("nick_name").value;
nickName = nick_name;
let w_s = new WebSocket("ws://127.0.0.1:8000/ws/" + nickName); // 把名称当作url参数发过去
ws = w_s;
console.log("ws://127.0.0.1:8000/ws/" + nickName);
ws.onmessage = function (data) {
var obj_data = JSON.parse(data.data);
console.log(data.data);
var p_ele = '<p>'+ obj_data.nick_name + ':'+ obj_data.msg +'</p>';
text_div.innerHTML += p_ele
}} function send_msg() {
var msg_s = document.getElementById("msg_s").value;
var to_user = document.getElementById("to_user").value;
let p_ele_s = "<p style='text-align: right'>" + msg_s + ':' + nickName + "</p>";
text_div.innerHTML += p_ele_s;
var msg_obj = JSON.stringify({to_user:to_user,msg:msg_s});
ws.send(msg_obj);
}
</script>
</body>
</html>
websocket之简易聊天室的更多相关文章
- 基于Node.js + WebSocket 的简易聊天室
代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...
- php+websocket搭建简易聊天室实践
1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...
- node.js+websocket实现简易聊天室
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...
- node+websocket创建简易聊天室
关于websocket的介绍太多,在这就不一一介绍了,本文主要实现通过websocket创建一个简易聊天室,就是90年代那种聊天室 服务端 1.安装ws模块,uuid模块,ws是websocket模块 ...
- 使用Html5下WebSocket搭建简易聊天室
一.Html5WebSocket介绍 WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站 ...
- WebSocket实现简易聊天室
前台页面: <html> <head> <meta http-equiv="Content-Type" content="text/html ...
- 小案例-WebSocket实现简易聊天室
前言 在详解 HTTP系列之一讲到HTTP/2.0 突破了传统的"请求-问答模式"这一局限,实现了服务器主动向客户端传送数据.而本章将通过一种在单个TCP连接上进行全双工通信的协议 ...
- 基于WebSocket的简易聊天室
用的是Flash + WebSocket 哦~ Flask 之 WebSocket 一.项目结构: 二.导入模块 pip3 install gevent-websocket 三.先来看一个一对一聊天的 ...
- Servlet WebSocket的简易聊天室
添加依赖 <!-- websocket --> <dependency> <groupId>javax.websocket</groupId> < ...
- 使用go,基于martini,和websocket开发简易聊天室
一.首先,需要了解一下websocket基本原理:here 二.go语言的websocket实现: 基于go语言的websocket也有不少,比如github.com/gorilla/websocke ...
随机推荐
- [Java复习] Spring Cloud - Netflix
Spring Cloud Netflix常用组件 服务注册与发现:Eureka 服务负载均衡:Ribbon 服务声明式客户端:Feign 服务熔断:Hystrix 服务网关: Zuul Eureka: ...
- (转)nginx 安全配置文档
原文:https://www.cnblogs.com/heaven-xi/p/9961357.html#top 1.配置文档中有多处明确写出了nginx的配置文件路径,该路径是测试环境中的路径,线上系 ...
- PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版)
PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版) 先看流程图: 大概介绍一下: 版本选择使用jenkins 中的 git parameter 插件实现 回滚方式 ...
- explain结果总结
id: SELECT查询序列号(SELECT识别符),也就是一条语句中,该select是第几次出现.在此语句中,select就只有一个,所以是1. select_type:SELECT查询类型 常见取 ...
- 【VS开发】MFC学习之 解决StretchBlt()图片缩放绘图失真
vc中位图伸缩函数StretchBlt在对图片进行缩放时会造成严重的图片失真.在了解解决方法前先巩固下StretchBlt的用法: StretchBlt 函数功能:函数从源矩形中复制一个位图到目标矩形 ...
- 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案
最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...
- 使用Nginx+WordPress搭建个人网站
背景 很多研究技术的朋友喜欢写博客.如果希望搭建一个完全属于自己的网站,也并不困难.这里简要分享一下我搭建这个博客网站的经验. 关键步骤 购买服务器.域名.DNS云解析服务 网站备案(可选) 安装Ng ...
- 高级UI-滤镜和颜色通道
滤镜在图片处理里面有很多的运用,尤其是相机使用了大量的滤镜,通过对颜色通道的调和,可以呈现出各种各样的效果 对图像进行一定的过滤加工处理,使用Paint设置滤镜效果 很多高级UI使用时候需要关闭硬件加 ...
- k8s 修改节点角色和删除节点
修改节点角色: kubectl label nodes cn-thin05 node-role.kubernetes.io/node= 卸载节点: kubectl drain jupiter --de ...
- tablespace表空间
tablespace——表空间,便于理解,把oracle数据库看作一个实在房间,表空间可以看作这个房间的空间,是可以自由分配,在这空间里面可以堆放多个箱子(箱子可以看作数据库文件),箱子里面再装物件( ...