1.多人聊天

  1. from geventwebsocket.handler import WebSocketHandler # 请求处理WSGI HTTP
  2. from geventwebsocket.server import WSGIServer # 替换Flask原来的WSGI服务
  3. from geventwebsocket.websocket import WebSocket # 语法提示
  4. from flask import Flask, render_template, request
  5.  
  6. app = Flask(__name__)
  7. socket_dict = {}
  8.  
  9. @app.route("/ws")
  10. def my_ws():
  11. ws_socket = request.environ.get("wsgi.websocket")# type:WebSocket
  12. socket_dict[ws_socket] = ws_socket # 可以使用用户名,使用动态路由参数传username
  13. print(socket_dict)
  14. while True:
  15. msg = ws_socket.receive()
  16. print(msg)
  17. for ksocket,vscoket in socket_dict.items():
  18. if ksocket == ws_socket:
  19. continue
  20. vscoket.send(msg)
  21.  
  22. @app.route("/wechat")
  23. def wechat():
  24. return render_template("测试用.html")
  25.  
  26. if __name__ == "__main__":
  27.  
  28. http_serv = WSGIServer(("0.0.0.0", 9527), app, handler_class=WebSocketHandler)
  29. # WebSocketHandler既支持websocket请求,也支持http请求
  30. http_serv.serve_forever() # wsgi启动服务
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="x-ua-compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>Title</title>
  8. <style>
  9. body #content_list {
  10. border: solid black;
  11. width: 400px;
  12. height: 400px;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <div id="content_list" style="overflow-y: auto"></div>
  18. <p>
  19. 昵称:<input type="text" id="username">
  20. <button onclick="login()">登录聊天室</button>
  21. </p>
  22. <input type="text" id="content">
  23. <button onclick="send_msg()">发送消息</button>
  24. </body>
  25. <script type="application/javascript">
  26. var ws = null;
  27.  
  28. function send_msg() {
  29. var msg = document.getElementById("content").value; //获取发送内容
  30. var sender = document.getElementById("username").value; //获取发送人名字
  31. // 发送的信息内容
  32. var send_str = {
  33. sender: sender,
  34. data: msg
  35. };
  36.  
  37. ws.send(JSON.stringify(send_str)); // 将发送的信息json序列化
  38. var my_div = document.getElementById("content_list"); // 获取div标签
  39. var ptag = document.createElement("p"); // 创建一个p标签
  40. ptag.innerText = msg + " : 我"; // 设置p标签中的文本内容
  41. ptag.style.cssText = "text-align: right"; // p标签设置css样式,文本靠右
  42. my_div.appendChild(ptag); // 将p标签添加进div标签中
  43. document.getElementById("content").value = "";
  44. }
  45.  
  46. function login() {
  47. var username = document.getElementById("username").value; // 获取登录用户名
  48. console.log(username);
  49. ws = new WebSocket("ws://127.0.0.1:9527/ws"); // 执行websocket服务,如果需要username,可以在url上增加
  50. // 当客户端收到消息时,执行匿名函数
  51. ws.onmessage = function (messageEvent) {
  52. console.log(messageEvent.data);
  53. var obj = JSON.parse(messageEvent.data); // 将接收的数据反序列化
  54. var my_div = document.getElementById("content_list"); // 获取div标签
  55. var ptag = document.createElement("p"); // 获取p标签
  56. ptag.innerText = obj.sender + " : " + obj.data; // 设置p标签中文本内容
  57. my_div.appendChild(ptag); // 将p标签放到div中
  58. };
  59. }
  60. </script>
  61. </html>

2.一对一聊天

  1. import json
  2. from geventwebsocket.handler import WebSocketHandler # 请求处理WSGI HTTP
  3. from geventwebsocket.server import WSGIServer # 替换Flask原来的WSGI服务
  4. from geventwebsocket.websocket import WebSocket # 语法提示
  5. from flask import Flask,render_template,request
  6.  
  7. app = Flask(__name__)
  8. socket_dict = {}
  9. @app.route("/ws/<username>")
  10. def my_ws(username):
  11. # 获取链接地址
  12. ws_socket = request.environ.get("wsgi.websocket") #type:WebSocket
  13. socket_dict[username] = ws_socket
  14. while True:
  15. msg = ws_socket.receive() # 接收浏览器发来的信息
  16. msg_dict = json.loads(msg) # 将信息反序列化,是字典
  17. receiver = msg_dict.get("receiver") # 获取字典中接收人的名字
  18. receiver_socket = socket_dict.get(receiver) # 从字典中找到接收人名字对应的链接地址
  19. receiver_socket.send(msg) # 向接收人的链接地址发送信息
  20. @app.route("/wechat")
  21. def wechat():
  22. return render_template("测试用.html")
  23. if __name__ == "__main__":
  24. http_serv = WSGIServer(("0.0.0.0",9527),app,handler_class=WebSocketHandler)
  25. # WebSocketHandler既支持websocket请求,也支持http请求
  26. http_serv.serve_forever() # wsgi启动服务
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="x-ua-compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>Title</title>
  8. <style>
  9. body #content_list {
  10. border: solid black;
  11. width: 400px;
  12. height: 400px;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <div id="content_list" style="overflow-y: auto"></div>
  18. <p>
  19. 昵称:<input type="text" id="username">
  20. <button onclick="login()">登录聊天室</button>
  21. </p>
  22. <input type="text" id="receiver">发送<input type="text" id="content">
  23. <button onclick="send_msg()">发送消息</button>
  24. </body>
  25. <script type="application/javascript">
  26. var ws = null;
  27.  
  28. function send_msg() {
  29. var msg = document.getElementById("content").value; //获取发送内容
  30. var receiver = document.getElementById("receiver").value; // 获取接收人名字
  31. var sender = document.getElementById("username").value; //获取发送人名字
  32. // 发送的信息内容
  33. var send_str = {
  34. receiver: receiver,
  35. sender: sender,
  36. data: msg
  37. };
  38.  
  39. ws.send(JSON.stringify(send_str)); // 将发送的信息json序列化
  40. var my_div = document.getElementById("content_list"); // 获取div标签
  41. var ptag = document.createElement("p"); // 创建一个p标签
  42. ptag.innerText = msg + " : 我"; // 设置p标签中的文本内容
  43. ptag.style.cssText = "text-align: right"; // p标签设置css样式,文本靠右
  44. my_div.appendChild(ptag); // 将p标签添加进div标签中
  45. document.getElementById("content").value = ""; //将聊天输入框置空
  46. }
  47.  
  48. function login() {
  49. var username = document.getElementById("username").value; // 获取登录用户名
  50. ws = new WebSocket("ws://127.0.0.1:9527/ws/" + username); // 执行websocket服务
  51. // 当客户端收到消息时,执行匿名函数
  52. ws.onmessage = function (messageEvent) {
  53. console.log(messageEvent.data);
  54. var obj = JSON.parse(messageEvent.data); // 将接收的数据反序列化
  55. var my_div = document.getElementById("content_list"); // 获取div标签
  56. var ptag = document.createElement("p"); // 获取p标签
  57. ptag.innerText = obj.sender + " : " + obj.data; // 设置p标签中文本内容
  58. my_div.appendChild(ptag); // 将p标签放到div中
  59. };
  60. }
  61. </script>
  62. </html>

websocket简单实现聊天的更多相关文章

  1. JAVA WebSocKet ( 简单的聊天室 )

    1, 前端代码 登入页 -> login.html <!DOCTYPE html> <html> <head> <meta charset=" ...

  2. python使用websocket简单组建聊天室

    server端 ###websocket_server### import socket import threading sock = socket.socket(socket.AF_INET, s ...

  3. Spring 学习——基于Spring WebSocket 和STOMP实现简单的聊天功能

    本篇主要讲解如何使用Spring websocket 和STOMP搭建一个简单的聊天功能项目,里面使用到的技术,如websocket和STOMP等会简单介绍,不会太深,如果对相关介绍不是很了解的,请自 ...

  4. Netty学习笔记(六) 简单的聊天室功能之WebSocket客户端开发实例

    在之前的Netty相关学习笔记中,学习了如何去实现聊天室的服务段,这里我们来实现聊天室的客户端,聊天室的客户端使用的是Html5和WebSocket实现,下面我们继续学习. 创建客户端 接着第五个笔记 ...

  5. Netty+WebSocket简单实现网页聊天

    基于Netty+WebSocket的网页聊天简单实现 一.pom依赖 <dependency>        <groupId>io.netty</groupId> ...

  6. nodejs与websocket模拟简单的聊天室

    nodejs与websocket模拟简单的聊天室 server.js const http = require('http') const fs = require('fs') var userip ...

  7. 基于websocket实现的一个简单的聊天室

    本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...

  8. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  9. Java和WebSocket开发网页聊天室

    小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项 ...

随机推荐

  1. go web编程——自定义路由设计

    本文主要讲解go语言web编程中自定义路由器的设计.在此之前需要先了解一下go语言web编程中路由与http服务的基本原理,可以参考笔者另一篇博文:go web编程——路由与http服务 . 我们已经 ...

  2. 数组降维-JavaScript中apply方法妙用

    海纳百川,有容乃大 1.普通循环转换方式 将多维数组(尤其是二维数组)转化为一维数组是业务开发中的常用逻辑,除了使用朴素的循环转换以外,我们还可以利用Javascript的语言特性实现更为简洁优雅的转 ...

  3. JavaScript面向对象编程(1)-- 基础

    自从有了Ajax这个概念,JavaScript作为Ajax的利器,其作用一路飙升.JavaScript最基本的使用,以及语法.浏览器对象等等东东在这里就不累赘了.把主要篇幅放在如何实现JavaScri ...

  4. shell使用标准输出返回函数值

  5. 关于.net中使用reportview所需注意

    参考文章链接:http://www.cnblogs.com/watercold/p/5258608.html 这段时间在做一个winform的小项目时,发现使用.net中的ReportViewer插件 ...

  6. PCB设计规则中英文对照

    Electrical(电气规则) Clearance:安全间距规则 Short Circuit:短路规则 UnRouted Net:未布线网络规则 UnConnected Pin:未连线引脚规则 Ro ...

  7. hive的数据定义之创建数据库和表

    1.对数据库的操作 create database hive_db //创建数据库hive_db create table hive_db.test(字段内容及其格式省略) //在数据库hive_db ...

  8. String、StringBuffer、StringBuilder详解

    String类 字符串广泛应用在java编程中,String类在java.lang包中,String类是final修饰的,不能被继承,String类对象创建后不能修改,由0或多个字符组成,包含在一对双 ...

  9. GO富集分析 信号通路

    基因富集分析是分析基因表达信息的一种方法,富集是指将基因按照先验知识,也就是基因组注释信息进行分类. 信号通路是指能将细胞外的分子信号经细胞膜传入细胞内发挥效应的一系列酶促反应通路.这些细胞外的分子信 ...

  10. MyBatis框架之异常处理

    MyBatis框架定义了许多的异常类,之所以定义这么多的异常类,应该是将每一种异常情况都独立出来,这样在出现异常时,定位就很明确了.而我们平时写代码时,都是瞎搞一通,异常类大多也是随便定义,或者是使用 ...