- 浏览: 1482841 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
https://github.com/openresty/lua-resty-websocket
的nginx的websocket的helloworld
先装openresty
配置文件为
关键点是
websocket的lua代码为
客户端html代码
的nginx的websocket的helloworld
先装openresty
配置文件为
worker_processes 1; events { worker_connections 1024; } http { charset utf-8,gbk; include mime.types; default_type text/plain; lua_package_path "/data/www/lua/?.lua;;"; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; lua_code_cache off; location /lua_webc { content_by_lua_file /data/www/lua/webs_client.lua; } location /webs { content_by_lua_file /data/www/lua/webs.lua; } location / { root html; index index.html index.htm; } # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
关键点是
location /webs { content_by_lua_file /data/www/lua/webs.lua; }
websocket的lua代码为
[root@VM_192_107_centos lua]# cat webs.lua 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 local data, typ, err = wb:recv_frame() if not data then ngx.log(ngx.ERR, "failed to receive a frame: ", err) return ngx.exit(444) end if typ == "close" then -- send a close frame back: local bytes, err = wb:send_close(1000, "enough, enough!") if not bytes then ngx.log(ngx.ERR, "failed to send the close frame: ", err) return end local code = err ngx.log(ngx.INFO, "closing with status code ", code, " and message ", data) return end if typ == "ping" then -- send a pong frame back: local bytes, err = wb:send_pong(data) if not bytes then ngx.log(ngx.ERR, "failed to send frame: ", err) return end elseif typ == "pong" then -- just discard the incoming pong frame else ngx.log(ngx.INFO, "received a frame of type ", typ, " and payload ", data) end wb:set_timeout(1000) -- change the network timeout to 1 second bytes, err = wb:send_text("Hello world") if not bytes then ngx.log(ngx.ERR, "failed to send a text frame: ", err) return ngx.exit(444) end bytes, err = wb:send_binary("blah blah blah...") if not bytes then ngx.log(ngx.ERR, "failed to send a binary frame: ", err) return ngx.exit(444) end local bytes, err = wb:send_close(1000, "enough, enough!") if not bytes then ngx.log(ngx.ERR, "failed to send the close frame: ", err) return end [root@VM_192_107_centos lua]#
客户端html代码
<html> <head> <script> var ws = null; function connect() { if (ws !== null) return log('already connected'); ws = new WebSocket('ws://haoning.net/webs'); 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>
发表评论
-
xl2tp 备份
2019-09-24 16:25 7332019年9月24日更新: 注意,需要开启firewall ... -
sdl笔记
2019-01-31 17:19 741sdl教程教程 https://github.com/Twin ... -
tinyemu
2019-01-24 17:59 1441参考https://bellard.org/jslinux/t ... -
aws搭建xl2tp给iphone使用
2018-12-26 21:37 19022019年12月26日 可以参考原来的配置 https:// ... -
consul的基本使用
2017-06-27 11:13 1409### 安装 [centos7上consul的安装](ht ... -
lvs的helloworld
2017-06-13 20:36 601###################lvs######### ... -
系统调用的helloworld
2017-05-04 16:14 660《2.6内核标准教程》 p293 #include < ... -
bitcoin和cgminer的安装
2017-04-05 22:45 1964参考 http://blog.csdn.net/rion_ch ... -
ceph安装和常用命令
2017-03-21 21:55 965/etc/hosts ssh-keygen ssh-copy- ... -
mobile terminal 笔记
2016-12-02 15:35 649找出旧的iphone4 越狱之后可以变个小操作系统 mobi ... -
socket基础和select(python)
2016-06-14 17:21 1807上接 c语言的socket基础ht ... -
socket基础(c语言)
2016-06-14 16:45 1007不使用select 普通的基础socket连接,对多个客户端的 ... -
ffmpeg+nginx 的直播(2,直播摄像头和麦克风)
2016-05-28 20:21 4385假设我的服务器是centos7 192.168.139.117 ... -
ffmpeg+nginx 的直播(1,直播播放的视频文件)
2016-05-26 17:11 661964位操作系统centos7 ############ 1.一 ... -
socat和netcat(nc)
2016-04-29 22:36 1756转 原文链接: http://www.wenquan.name ... -
neutron基础九(qemu nat网络)
2016-02-06 17:21 1631接上基础八,kvm透传nested忽略 1.在主机ce ... -
neutron基础八(qemu 桥接网络)
2016-02-06 13:13 1550qemu的桥接和nat的qemu启动命令是一样的,但是后续的脚 ... -
neutron基础七(qemu tap)
2016-02-02 17:02 1034使用qemu 建立个虚拟机 然后用tap设备, 根据基础六,t ... -
neutron基础六(bridge fdb)
2016-01-28 18:30 2281转发表 在三台机器上建立三个namespace 192.16 ... -
南北流量
2016-01-23 23:26 1837一、三层网络架构: 接入层:负责服务器的接入和隔离 汇聚层:汇 ...
相关推荐
4. **项目实践**:教程涵盖了从简单的 "Hello World" 程序到逐步构建聊天室的全过程。在项目部分,可能会讲解如何创建服务器端接收和广播消息,以及客户端如何连接、发送和接收消息的逻辑。 5. **技术扩展**:...
这个应用将监听8000端口,并在访问根URL时返回"Hello, world!"。 **3.2. Supervisor配置** 在Supervisor的配置文件中,为你的Tornado应用添加一个配置段,如下: ``` [program:your_app_name] command=/usr/bin/...
return [b"Hello World"] # 运行uWSGI服务 uwsgi --http :9090 --wsgi-file test.py ``` 通过浏览器访问`http://localhost:9090`,如果看到“Hello World”的页面,则说明安装及配置成功。 #### 创建Django项目 ...
server.add '/hello', ->(req, res) { res.text = 'Hello, World!' } server.start ``` 3. 部署:在生产环境中,agoo可以与反向代理如Nginx配合使用,以更好地管理负载和提供静态文件服务。 四、性能对比 与其他...
这个函数将返回"Hello, World!"文本作为响应。 6. **运行服务器** 使用`app.run()`命令启动开发服务器。在命令行中运行`python app.py`,然后在浏览器中访问`http://localhost:5000`,就可以看到你的Web应用了。 ...
了解Node.js的安装、环境配置以及Hello World程序,是开始Node.js之旅的第一步。 三、Node.js核心模块 1. 文件系统(fs):Node.js提供了一个内置的fs模块,用于处理文件和目录操作,如读取、写入、创建和删除文件...
在这个例子中,访问根URL("/")时,会触发`hello_world`函数,返回"Hello, World!"的响应。 Flask的核心组件包括: 1. **请求对象** (Request):用于获取HTTP请求的信息,如参数、头信息、数据等。 2. **响应对象...
例如,上述代码中,根路径'/'将调用hello_world()函数。 5. 模板渲染与Jinja2 Flask使用Jinja2模板引擎处理HTML模板。在templates目录下创建一个index.html文件,然后在视图函数中返回渲染后的模板: ```python ...
文档可能介绍了如何安装Node.js,创建第一个“Hello, World!”程序,以及Node.js的全局对象和基本数据类型。 2. **模块系统**:Node.js采用CommonJS模块规范,每个文件都是一个模块,有自己的作用域。`require`函数...
学习node.js的好书 下面是目录: Preface 1 ...Hello World 309 Creating a calculator 311Table of Contents [ vii ] Implementing callbacks 313 Closing thoughts 314 Links and resources 315 Index 317
例如,`app.get('/hello', function(req, res) { res.send('Hello World!'); })`将处理所有GET请求到'/hello'的请求。 3. **模板引擎**:Express支持多种模板引擎,如ejs、jade(现在称为pug)、handlebars等,用于...
self.write("Hello, world") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": parse_command_line() app = make_app() app.listen(options.port) ...
- **Hello, World**:通过创建第一个 "Hello, World" 应用,学习基本的文件结构和 `console.log()` 函数的使用。 - **模块系统**:理解 CommonJS 模块规范,以及 `require` 和 `module.exports` 的工作原理。 2. ...
例如,创建一个返回"Hello, World!"的简单路由: ```python from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Hello, World!"} ``` 四、处理请求参数 FastAPI...