`
haoningabc
  • 浏览: 1478320 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

openresty聊天室的helloworld

阅读更多
openresty的websocket + redis的subscribe


参考
https://blog.csdn.net/orangleliu/article/details/50898014
利用redis的subscribe
参考http://www.runoob.com/redis/pub-sub-subscribe.html

安装redis
brew install redis
安装openresty:
brew install openssl  

  
./configure --prefix=/usr/local/openresty --with-openssl=/usr/local/Cellar/openssl/1.0.2o_1  
make  
make install

openssl还是有问题 shared等
参考
https://blog.csdn.net/csdncqmyg/article/details/73835354

bundle/nginx-x-x-x(版本号)/auto/lib/openssl/conf
把.openssl删掉 ,只删这个单词

nginx调用的lua模块
ws_resdis_json.lua
local server = require "resty.websocket.server"
local redis = require "resty.redis"

local cjson = require "cjson"

--local channel_name = "chat"
local msg_id = 0
local wb, err = server:new{
  timeout = 10000,
  max_payload_len = 65535
}
if not wb then
  ngx.log(ngx.ERR, "failed to new websocket: ", err)
  return ngx.exit(444)
end

function creatChanel(channel_name)
	push = function()
	    -- --create redis
	    local red = redis:new()
	    red:set_timeout(5000) -- 1 sec
	    local ok, err = red:connect("127.0.0.1", 6379)
	    if not ok then
	        ngx.log(ngx.ERR, "failed to connect redis: ", err)
	        wb:send_close()
	        return
	    end

	    --sub
	    local res, err = red:subscribe(channel_name)
	    if not res then
	        ngx.log(ngx.ERR, "failed to sub redis: ", err)
	        wb:send_close()
	        return
	    end

	    -- loop : read from redis
	    while true do
	        local res, err = red:read_reply()
	        if res then
	            local item = res[3]
	            local bytes, err = wb:send_text(tostring(msg_id).." "..item)
	            if not bytes then
	                -- better error handling
	                ngx.log(ngx.ERR, "failed to send text: ", err)
	                return ngx.exit(444)
	            end
	            msg_id = msg_id + 1
	        end
	    end
	end


	co = ngx.thread.spawn(push)
end

--main loop
while true do
    local data, typ, err = wb:recv_frame()

    if wb.fatal then
        ngx.log(ngx.ERR, "failed to receive frame: ", err)
        return ngx.exit(444)
    end

    if not data then
        local bytes, err = wb:send_ping()
        if not bytes then
          ngx.log(ngx.ERR, "failed to send ping: ", err)
          return ngx.exit(444)
        end
        ngx.log(ngx.ERR, "send ping: ", data)
    elseif typ == "close" then
        break
    elseif typ == "ping" then
        local bytes, err = wb:send_pong()
        if not bytes then
            ngx.log(ngx.ERR, "failed to send pong: ", err)
            return ngx.exit(444)
        end
    elseif typ == "pong" then
        ngx.log(ngx.ERR, "client ponged")
    elseif typ == "text" then
		--local json_str = '{"name": "Bruce.Lin", "age": 25}'
		local json_str = data
   		local json = cjson.decode(json_str)

    	local channel_name = json["name"]
    	creatChanel(channel_name)

        --send to redis
        local red2 = redis:new()
        red2:set_timeout(1000) -- 1 sec
        local ok, err = red2:connect("127.0.0.1", 6379)
        if not ok then
            ngx.log(ngx.ERR, "failed to connect redis: ", err)
            break
        end
        local res, err = red2:publish(channel_name, data)
        if not res then
            ngx.log(ngx.ERR, "failed to publish redis: ", err)
        end
    end
end

wb:send_close()
ngx.thread.wait(co)

nginx的配置文件
加入
	location = /sredis {
    	    content_by_lua_file conf/lua/ws_redis_json.lua;
    	}

客户端代码
<!DOCTYPE HTML>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <script type="text/javascript">
    var ws = null;

    function WebSocketConn() {
        if (ws != null && ws.readyState == 1) {
            log("已经在线");
            return
        }

        if ("WebSocket" in window) {
            // Let us open a web socket
            ws = new WebSocket("ws://localhost/sredis");

            ws.onopen = function() {
                log('成功进入聊天室');
            };

            ws.onmessage = function(event) {
                log(event.data)
            };

            ws.onclose = function() {
                // websocket is closed.
                log("已经和服务器断开");
            };

            ws.onerror = function(event) {
                console.log("error " + event.data);
            };
        } else {
            // The browser doesn't support WebSocket
            alert("WebSocket NOT supported by your Browser!");
        }
    }

    function SendMsg() {
        if (ws != null && ws.readyState == 1) {
            var msg = document.getElementById('msgtext').value;
            ws.send(msg);
        } else {
            log('请先进入聊天室');
        }
    }

    function WebSocketClose() {
        if (ws != null && ws.readyState == 1) {
            ws.close();
            log("发送断开服务器请求");
        } else {
            log("当前没有连接服务器")
        }
    }

    function log(text) {
        var li = document.createElement('li');
        li.appendChild(document.createTextNode(text));
        document.getElementById('log').appendChild(li);
        return false;
    }
    </script>
</head>

<body>
	{"name": "Bruce.Lin", "age": 25}
    <div id="sse">
        <a href="javascript:WebSocketConn()">进入聊天室</a> &nbsp;
        <a href="javascript:WebSocketClose()">离开聊天室</a>
        <br>
        <br>
        <input id="msgtext" type="text">
        <br>
        <a href="javascript:SendMsg()">发送信息</a>
        <br>
        <ol id="log"></ol>
    </div>
</body>

</html>


测试,进入聊天室
{"name": "Bruce.Lin", "age": 25}

name就是发给聊天室的name

分享到:
评论

相关推荐

    基于openresty的多人聊天室

    【基于OpenResty的多人聊天室】是一种利用OpenResty技术构建的实时在线交流平台,无需额外的存储设备,即可让多个用户在一个共享空间内进行无痕聊天。OpenResty是一个强大的Web服务系统,它集成了Nginx与LuaJIT,...

    Openresty服务器使用lua脚本写的Hello World简单实例

    本文将详细介绍如何在OpenResty上使用Lua脚本来实现一个简单的"Hello World"示例。 首先,我们需要在本地环境中安装OpenResty。通常,你可以从OpenResty官网下载最新版本的源码包,然后按照官方文档提供的步骤进行...

    基于websocket的多人多聊天室服务器

    在本文中,我们将深入探讨如何基于WebSocket构建一个支持多人多聊天室的服务器,以及如何利用OpenResty这一强大的Web服务器平台来实现这一目标。 首先,WebSocket API允许Web应用程序在单个TCP连接上进行全双工通信...

    《OpenResty最佳实践》 .pdf

    - **Hello World示例**:通过一个简单的示例介绍如何结合OpenResty和Nginx实现一个基本的HTTP服务。 - **Lua模块的使用**:讲解了如何在OpenResty中使用Lua模块,包括如何加载和调用第三方resty库。 - **动态限速与...

    OpenResty1.25版本安装包

    OpenResty是一款基于Nginx和LuaJIT的高性能Web平台,它将强大的Lua脚本语言集成到Nginx中,使开发者能够利用Nginx的事件驱动、非阻塞I/O模型处理高并发场景,并提供了丰富的模块集来构建复杂的Web服务。OpenResty ...

    openresty源码(openresty-1.19.9.1.tar.gz)

    OpenResty是一款基于Nginx与LuaJIT的高性能Web平台,它集成了大量开源的高性能库,使得开发者能够利用Lua脚本语言快速构建出强大的动态Web应用。在这个压缩包"openresty-1.19.9.1.tar.gz"中,包含的是OpenResty的...

    ngx_openresty_lua_技术交流实践

    - **HelloWorld**:通过编写简单的HelloWorld程序来初步了解OpenResty。 ### LuaRestyRedisLibrary - **Redis接口封装**:学习如何简化Redis建连和拆连操作,以及如何实现Redis的发布订阅模式。 - **Lua与Redis交互...

    OpenResty(openresty-1.21.4.1.tar.gz)

    OpenResty(openresty-1.21.4.1.tar.gz) OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的...

    openresty官方学习资料

    《OpenResty官方学习资料》是一份由章亦春编写的综合教程,旨在帮助开发者从初识到精通OpenResty这一强大的Web服务框架。OpenResty是基于Nginx和LuaJIT的开源项目,它将Nginx的高性能与Lua的轻量级脚本能力相结合,...

    openresty实践

    构建简单的Hello World程序是开始实践的第一步。 OpenResty提供了丰富的API来操作HTTP请求和响应,包括获取URI参数、获取请求body、输出响应体等。对于高级应用,还需要掌握如何使用Nginx的内置变量、 ...

    OpenResty教程,OpenResty使用教程

    OpenResty教程,OpenResty使用教程 OpenResty是大并发服务器的不错选择,可实现数据校验前置、缓存前置、数据过滤、API请求聚合、认证管理、负载均衡、流量控制、灰度发布、降级、监控等功能

    OpenResty安装过程.pptx

    ### OpenResty安装过程知识点详解 #### 一、OpenResty简介 - **定义**:OpenResty是一款基于Nginx与Lua的高性能Web平台,它使得开发人员能够轻松地编写出高性能、高可靠性的Web应用程序和服务。 - **特点**: - ...

    openresty-1.25.3.1源码

    《OpenResty 1.25.3.1 源码详解》 OpenResty 是一个基于 Nginx 的高性能、全功能的 Web 应用服务器和开发平台,它集成了 LuaJIT 脚本语言,允许开发者在 Nginx 的配置文件中直接编写 Lua 脚本来实现复杂的业务逻辑...

    OpenResty最佳实践

    此外,我们还会介绍如何编写一个简单的Hello World程序,并通过location指令与Nginx的内置变量进行配合,以实现获取uri参数、获取请求body、输出响应体以及日志记录等功能。 OpenResty不仅支持Lua脚本,还提供了...

    openresty-1.23.0.1.tar.gz

    这个openresty包是基于官方最新代码 编译好的。 openresty中升级nginx openresty如何升级nginx的版本? Nginx 有RCE 漏洞。 修复nginx 爆出栈溢出rce漏洞,openresty什么时候升级,或者如何单独升级nginx nginx内核...

    openresty1.13.6.2

    OpenResty是一个基于Nginx和LuaJIT的高性能Web平台,它允许开发人员使用Lua语言来编写服务器端代码,实现动态处理、高并发的Web应用。标题中的"openresty1.13.6.2"指的是OpenResty的一个特定版本,即1.13.6.2。这个...

    Openresty 缓存策略.pdf

    OpenResty是一款集成了Nginx和LuaJIT的服务器软件,能够以高效的事件驱动模型处理高并发请求。在OpenResty中,开发者可以利用Lua脚本来实现复杂的业务逻辑,同时使用其内置的高性能缓存机制来提升应用程序的性能。 ...

    openresty 入门

    OpenResty 是一个基于 Nginx 和 LuaJIT 的高性能 Web 平台,它通过提供一个集成了大量 Lua 库的 Nginx 模块,使得开发者可以在 Nginx 中直接使用 Lua 语言编写逻辑处理代码。OpenResty 的优势在于其高性能和灵活性,...

    OpenResty Best Practices.pdf

    《OpenResty最佳实践》是一本深入探讨OpenResty使用和优化的专业指南,它涵盖了从基础到高级的各种主题,旨在帮助开发者充分利用OpenResty的强大功能。OpenResty是一款基于Nginx和LuaJIT的高性能Web平台,它将Nginx...

    openResty-best-practices

    通过一个简单的“HelloWorld”示例,可以学习如何在OpenResty中使用Lua脚本接收请求、处理逻辑并输出响应。这个示例通常会结合获取URI参数、请求body以及输出响应体的基本操作。 ### 进阶技巧 #### Lua进阶编程 ...

Global site tag (gtag.js) - Google Analytics