websocket-单群聊

简介

WebSocket是一种在单个TCP连接上进行全双工通信的协议。

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

Web - Socket  客户端 与 服务器 达成一个协议
websocket 客户端 与 websocket 服务器 达成一个websocket协议

来个小例子方便大家理解:

ws-socket.py

from flask import Flask,request
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer    #应用程序网端接口的一个服务
from  geventwebsocket.websocket import WebSocket     #做语法提示用

app = Flask(__name__)

@app.route("/conn_ws")
def ws_app():
    # print(request.environ)  请求原始信息
    use_socket = request.environ.get("wsgi.websocket") #type:WebSocket   #告诉编译器 use_socket的语法去WebSocket里面进行查找
    #返回值是<geventwebsocket.websocket.WebSocket object at 0x000001FE56EDD868>
    while True:
        msg = use_socket.receive()  #接收浏览器发来的消息
        print(msg)
        use_socket.send(msg)        #将接收到的消息返回给浏览器

http_serv = WSGIServer(("0.0.0.0",9527),app,handler_class=WebSocketHandler) #websocket不支持 Werkzeug,只支持wsgi,所以将Werkzeug替换掉; 如果不是Http请求,需要用WebSocketHandler处理机制
http_serv.serve_forever() #启动

my_ws.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
</body>
<script type="application/javascript">
    var ws = new WebSocket("ws://127.0.0.1:9527/conn_ws");   #创建一个ws的请求地址
    ws.onmessage=function (messageEvent) {       #接收服务器send到浏览器端的消息,一旦有消息会触发onmessage 机制
      console.log(messageEvent.data)     } 

</script> </html>

websocket实现单群聊

ws-socket.py

import json

from flask import Flask,request,render_template

from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket

app = Flask(__name__)

user_socket_dict = {}

@app.route(‘/conn/ws/<user_nick>‘)
def ws_app(user_nick):
    user_socket = request.environ.get(‘wsgi.websocket‘)
    user_socket_dict[user_nick] = user_socket

    while True:
        msg = user_socket.receive()
        print(msg)
        msg_dict = json.loads(msg)
        to_user = msg_dict.get(‘to_user‘)
        if to_user:
            to_user_socket = user_socket_dict.get(to_user)  #如果昵称存在,则是单聊;昵称为空,为群聊
            to_user_socket.send(msg)
        else:
            for socket in list(user_socket_dict.values()):
                socket.send(msg)

@app.route(‘/‘)
def index():
    return render_template(‘my_ws.html‘)
if __name__ == ‘__main__‘:
    http_server = WSGIServer((‘0.0.0.0‘,8888),app,handler_class=WebSocketHandler)
    http_server.serve_forever()

my_ws.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="text" id="nick"><button onclick="login()">登录聊天室</button>
<p>发送给: <input type="text" id="to_user"> 消息: <input type="text" id="msg"></p>
<button id="send_btn" onclick="send()">发送</button>

<p>
<div id="chat_list">

</div>
</p>

</body>
<script type="application/javascript">
    var ws = null;

    function login() {
        var nick = document.getElementById(‘nick‘).value;
        ws = new WebSocket(‘ws://127.0.0.1:8888/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(‘msg‘).value;
        var to_user = document.getElementById(‘to_user‘).value;
        console.log(to_user);
        if(to_user == null){
            to_user = ‘‘
        }
        var send_str = {
            from_user:document.getElementById(‘nick‘).value,
            to_user:to_user,
            message:message
        };
        var json_send_str = JSON.stringify(send_str);
        ws.send(json_send_str);
    }
</script>
</html>

原文地址:https://www.cnblogs.com/yaraning/p/10981720.html

时间: 2024-10-10 14:33:27

websocket-单群聊的相关文章

websocket 群聊,单聊,加密,解密

群聊 from flask import Flask, request, render_templatefrom geventwebsocket.handler import WebSocketHandlerfrom gevent.pywsgi import WSGIServer from geventwebsocket.websocket import WebSocket app = Flask(__name__) # type:Flask user_socket_list = [] @app

Websocket 单聊功能

单聊代码 import json from flask import Flask,request,render_template from geventwebsocket.handler import WebSocketHandler from gevent.pywsgi import WSGIServer from geventwebsocket.websocket import WebSocket app = Flask(__name__) user_socket_dict = {} @ap

SpringBoot实现WebSocket单聊

一.创建项目并导入依赖 ? ? <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <

SpringBoot实现WebSocket群聊

一.创建项目并导入依赖 ? ? <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <arti

Node.js websocket 使用 socket.io库实现实时聊天室

认识websocket WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duple).一开始的握手需要借助HTTP请求完成. 其实websocket 并不是很依赖Http协议,它也拥有自己的一套协议机制,但在这里我们需要利用的socket.io 需要依赖到http . 之前用java jsp写过一个聊天,其实实现逻辑并不难,只是大部分时间都用在UI的设计上,其实现原理就是一个基于websocket的通信,要想做一个好的聊天室,我觉得大部

融云IM 基础服务开发指南WebIMLib API 示例 【干货】

Web SDK API 示例 简介 融云 Web SDK API 用法及常见异常总结,为了方便刚接触融云 Web SDK 开发者朋友们写下此文档,希望可以帮到你们. 说明: 1.函数参数中使用 [] 为可选参数(数组除外). 2.**** => **** 在本文档中表示为示例代码和结果,例:1+2 => 3. 初始化 初始化 SDK 执行初始化需要在开发者后台新建应用得到 AppKey 和 token,初始化代码: RongIMLib.RongIMClient.init(appkey,[dat

融云亮相GDG谷歌女性开发者大会 揭秘IMSDK网络优化策略

4 月 20 日,冷雨阻碍不了天津GDG谷歌女性开发者大会的热烈召开,一众开发者.架构师和科技公司创业者云集一堂,就女性开发者的技术.职场.人生多方面话题展开深入探讨.活动由GDG (谷歌开发者社区) 的 Women Tech Leader(WTM)发起并组织,旨在鼓励和促进女性在技术领域的参与.融云作为云通信技术领导者,在大会上就“即时通讯 SDK 的网络优化策略”主题开展演讲,与各界分享多年积累的云通信技术应用经验,同时表达了对全球女性开发者重要地位的支持和鼓励. 作为通信云行业领导企业,融

spring websocket 和socketjs实现单聊群聊,广播的消息推送详解

spring websocket 和socketjs实现单聊群聊,广播的消息推送详解 WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据. 我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而

Swoole实现基于WebSocket的群聊私聊

本文属于入门级文章,大佬们可以绕过啦.如题,本文会实现一个基于Swoole的websocket聊天室(可以群聊,也可以私聊,具体还需要看数据结构的设计). 搭建Swoole环境 通过包管理工具 # 安装依赖包 $ sudo apt-get install libpcre3 libpcre3-dev # 安装swoole $ pecl install swoole # 添加extension拓展 $ echo extension=swoole.so > /etc/php5/cli/conf.d/s