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

openresty websocket

阅读更多
mac安装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删掉 ,只删这个单词





几年前调过的

http://haoningabc.iteye.com/blog/2168717

参考教程如下
openresty
http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html

https://www.openresty.net.cn/

https://github.com/openresty/lua-nginx-module
http://wiki.jikexueyuan.com/project/openresty/openresty/get_url_param.html

https://www.cnblogs.com/scotoma/p/3330190.html

nginx.conf添加
		location /1.0/websocket {
			lua_socket_log_errors off;
			lua_check_client_abort on;
			content_by_lua_block {
				local server = require "resty.websocket.server"
				local wb, err = server:new{
				    timeout = 5000,  -- in milliseconds
				    max_payload_len = 65535,
				}
				if not wb then
					ngx.log(ngx.ERR, "failed to new websocket: ", err)
					return ngx.exit(444)
				end
				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
					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.INFO, "client ponged")
					elseif typ == "text" then
						local bytes, err = wb:send_text("from nginx:"..data)
						if not bytes then
						  	ngx.log(ngx.ERR, "failed to send text: ", err)
						  	return ngx.exit(444)
						end
					end
				end
				wb:send_close()
			}
		}

客户端
<html>
<head>
<script>
var ws = null;
function connect() {
  if (ws !== null) return log('already connected');
  ws = new WebSocket('ws://localhost/1.0/websocket');
  ws.onopen = function () {
    log('connected');
  };
  ws.onerror = function (error) {
    log(error);
  };
  ws.onmessage = function (e) {
    log('recv: ' + e.data);
  };
  ws.onclose = function () {
    log('disconnected');
    ws = null;
  };
  return false;
}
function disconnect() {
  if (ws === null) return log('already disconnected');
  ws.close();
  return false;
}
function send() {
  if (ws === null) return log('please connect first');
  var text = document.getElementById('text').value;
  document.getElementById('text').value = "";
  log('send: ' + text);
  ws.send(text);
  return false;
}
function log(text) {
  var li = document.createElement('li');
  li.appendChild(document.createTextNode(text));
  document.getElementById('log').appendChild(li);
  return false;
}
</script>
</head>
<body>
  <form onsubmit="return send();">
    <button type="button" onclick="return connect();">
      Connect
    </button>
    <button type="button" onclick="return disconnect();">
      Disconnect
    </button>
    <input id="text" type="text">
    <button type="submit">Send</button>
  </form>
  <ol id="log"></ol>
</body>
</html>


调用url的例子

function max(mystr)
	local sock = ngx.socket.tcp()
	--ngx.say("hello I am in /data/www/lua/ ")
	ngx.say(mystr)
--	local ai_url = "http://10.22.57.168:8080/interaction"
	local ok, err = sock:connect("www.baidu.com", 80)
	--local ok, err = sock:connect(ai_url, 80)
	if not ok then
	    ngx.say("failed to connect to baidu: ", err)
	    return
	end

	local req_data = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n"
--	local req_data = '{"misid":"12345","content":{"type":"manual","text":"附近有什么外卖"},"tm":1524130703583}'
	local bytes, err = sock:send(req_data)
	if err then
	    ngx.say("failed to send to baidu: ", err)
	    return
	end

	local data, err, partial = sock:receive()
	if err then
	    ngx.say("failed to recieve to baidu: ", err)
	    return
	end

	sock:close()
	ngx.say("successfully talk to baidu! response first line: ", data)
end
max("hello world ya")

简单点的
local res = ngx.location.capture(
                        'http://10.22.57.168:8080/interaction',
                        {
                           method = ngx.HTTP_POST,
--                           args = ngx.encode_args({a = 1, b = '2&'}),
                           --body = ngx.encode_args({c = 3, d = '4&'})
                           body = '{"misid":"12345","content":{"type":"manual","text":"附近有什么外卖"},"tm":1524130703583}'
                       }
                    )
ngx.say(res.body)

websocket 的
local server = require "resty.websocket.server"
local wb, err = server:new{
    timeout = 5000,  -- in milliseconds
    max_payload_len = 65535,
}
if not wb then
	ngx.log(ngx.ERR, "failed to new websocket: ", err)
	return ngx.exit(444)
end
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
	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.INFO, "client ponged")
	elseif typ == "text" then
		local cjson = require "cjson"
		--local json_str = '{"name": "hao.ning", "age": 25}'
		--local json = cjson.decode(json_str)
		local json = cjson.decode(data)

		if not json then
		  	ngx.log(ngx.ERR, "failed json: ", err)
		  	return ngx.exit(444)
		end
--		local bytes, err = wb:send_text("from nginx /data/www/lua: "..data)
		ngx.ctx.wb_list={}
		ngx.ctx.wb_list["hao"]="abc"
		ngx.ctx.wb_list[json['name']]="aaaa"

		--local bytes, err = wb:send_text("from nginx save wb:"..json['name'])
		--local bytes, err = wb:send_text("from nginx save wb:"..table.getn(ngx.ctx.wb_list))
		local bytes, err = wb:send_text("from nginx save wb:"..ngx.ctx.wb_list["Bruce.Lin"])
		if not bytes then
		  	ngx.log(ngx.ERR, "failed to send text: ", err)
		  	return ngx.exit(444)
		end
	end
end
wb:send_close()



nginx.conf配置执行lua


location /hellolua {
            content_by_lua_file /data/www/lua/luatest.lua;
        }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics