学习WebSocket
初识WebSocket:
index.html
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>初识WebSocket</title>
- </head>
- <body>
- <div style="margin-top: 30px;margin-left:30px">
- <input type="text" id="info">
- <button id="send">send</button>
- <div id="notice"></div>
- <div id="msg"></div>
- </div>
- </body>
- <script>
- var info = document.getElementById("info");
- var send= document.getElementById("send");
- var notice = document.getElementById("notice");
- var msg = document.getElementById("msg");
- var ws = new WebSocket("ws://echo.websocket.org/");
- ws.onopen = function(){
- notice.innerHTML = "connected";
- }
- ws.onclose = function(){
- notice.innerHTML = "closed"
- }
- ws.onmessage = function(res){
- console.log(res);
- msg.innerHTML = res.data;
- }
- send.onclick = function(){
- ws.send(info.value)
- }
- </script>
- </html>
这个代码运行之后,在输入框中输入的数据都会原封不动的返回,因为使用的ws://echo.websocket.org/这个地址。
使用自己搭建的服务器
前面一个代码中使用的ws://echo.websocket.org/这个服务器,这里参考大多数教程中的做法,使用node.js来搭建一个websocket服务器。
node.js-websocket模块,参考:https://www.npmjs.com/package/nodejs-websocket
安装node.js-websocket模块:cd path_to_workspance && npm install nodejs-websocket。
上面这个模块中介绍的使用方法,如下:
server.js
- var ws = require("nodejs-websocket")
- var port = 8001;
- var server = ws.createServer(function (conn) {
- console.log("New connection");
- //收到数据进行的操作
- conn.on("text", function (str) {
- console.log("Received "+str);
- conn.sendText(str.toUpperCase()+"!!!");
- });
- //关闭连接进行的操作。
- conn.on("close", function (code, reason) {
- console.log("Connection closed");
- });
- });
- server.listen(port)
- console.log("websocket started , listening " + port)
使用node server.js来运行搭建的服务器。
然后,将前面第一个index.html中的ws://echo.websocket.org/,替换为ws://localhost:8001即可,然后即可访问index.html进行操作了。
有点问题
上面这个js程序刚开始是可以正常运行的,但是,一旦浏览器进行刷新操作或者关闭了窗口,那么node就会报错,自己搭建的服务器就会崩溃,提示下面的信息:
- websocket started , listening 8001
- New connection
- Connection closed
- events.js:183
- throw er; // Unhandled 'error' event
- ^
- Error: read ECONNRESET
- at _errnoException (util.js:1022:11)
- at TCP.onread (net.js:628:25)
从上面的信息可以看到出错原因是因为没有为error事件绑定handle函数。
可以看一下这个:event-errorerrobj
解决方法就是稍加修改一下上面的server.js
- var ws = require("nodejs-websocket")
- var port = 8001;
- var server = ws.createServer(function (conn) {
- console.log("New connection");
- //收到数据进行的操作
- conn.on("text", function (str) {
- console.log("Received "+str);
- conn.sendText(str.toUpperCase()+"!!!");
- });
- //关闭连接进行的操作。
- conn.on("close", function (code, reason) {
- console.log("Connection closed");
- });
- //出现错误进行的操作,比如客户端刷新网页、关闭窗口等
- conn.on("error", function(err){
- console.log("some accident happend");
- console.log(err);
- });
- });
- console.log("websocket started , listening " + port)
- server.listen(port)
重新使用node server.js启动服务器,再次访问index.html,进行刷新或者关闭窗口时,服务器都不会崩溃了,服务器后台输出内容如下:
- websocket started , listening 8001
- New connection
- Received demo
- Connection closed
- some accident happend
- { Error: read ECONNRESET
- at _errnoException (util.js:1022:11)
- at TCP.onread (net.js:628:25) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
- New connection
- Received haha
- Connection closed
- some accident happend
- { Error: read ECONNRESET
- at _errnoException (util.js:1022:11)
- at TCP.onread (net.js:628:25) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
发送广播消息
要发送广播,首要问题就是:需要知道所有连接中的客户端。
node.js-websocket模块中有办法获得,详情参考server.connections
- function broadcast(server, msg) {
- server.connections.forEach(function (conn) {
- conn.sendText(msg)
- })
- }
学习WebSocket的更多相关文章
- 如何学习 websocket ?
如何学习 websocket ? 使用 HTML https://github.com/phoboslab/jsmpeg MPEG1 进行播放 https://w3c.github.io/media- ...
- 学习WebSocket(二):使用Spring WebSocket做一个简单聊天室
聊天室高频率.低延时完全符合websocket的特点,所以聊天室使用websocket再适合不过了. 聊天室的功能并没有比上一节代码多多少,主要在握手阶段对用户的session做处理,对用户的消息进行 ...
- 学习WebSocket(一):Spring WebSocket的简单使用
1.什么是websocket? WebSocket协议定义了一种web应用的新功能,它实现了服务器端和客户端的全双工通信.全双工通信即通信的双方可以同时发送和接收信息 的信息交互方式.它是继Java ...
- 通讯框架 t-io 学习——websocket 部分源码解析
前言 前端时间看了看t-io的websocket部分源码,于是抽时间看了看websocket的握手和他的通讯机制.本篇只是简单记录一下websocket握手部分. WebSocket握手 好多人都用过 ...
- 学习WebSocket一(WebSocket初识)
Java EE 7 去年刚刚发布了JSR356规范,使得WebSocket的Java API得到了统一,Tomcat从7.0.47开始支持JSR356,这样一来写WebSocket的时候,所用的代码都 ...
- 学习WebSocket笔记
由于HTTP协议是无状态的,服务器只会响应来自客户端的请求,但是它与客户端之间不具备持续连接. 当用户在浏览器上进行操作时,可以请求服务器上的api:但是反过来不可以:服务端发生了一件事,无法将这个事 ...
- WebSocket 学习(三)--用nodejs搭建服务器
前面已经学习了WebSocket API,包括事件.方法和属性.详情:WebSocket(二)--API WebSocket是基于事件驱动,支持全双工通信.下面通过三个简单例子体验一下. 简单开始 ...
- WebSocket学习笔记——无痛入门
WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报 分类: 物联网学习笔记(37) 版权声明:本文为博主原 ...
- websocket学习和群聊实现
WebSocket协议可以实现前后端全双工通信,从而取代浪费资源的长轮询.在此协议的基础上,可以实现前后端数据.多端数据,真正的实时响应.在学习WebSocket的过程中,实现了一个简化版群聊,过程和 ...
随机推荐
- 【PAT】B1011 A+B 和 C
注意数据的范围,使用long long就行了 #include<stdio.h> int main(){ int N;scanf("%d",&N); for(i ...
- 【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
参考资料及致谢 本文的绝大部分内容转载自以下几篇文章,首先向原作者致谢,希望自己能在这些前辈们的基础上能有所总结提升. 1. 运动规划/路径规划/轨迹规划的联系与区别 https://blog.csd ...
- Python里面search()和match()的区别
转自https://www.cnblogs.com/aaronthon/p/9435967.html match()函数只检测字符串开头位置是否匹配,匹配成功才会返回结果,否则返回None searc ...
- vue-cli3安装创建项目以及目录结构
安装脚手架cli3.0 全局安装 npm install -g @vue/cli 或 yarn global add @vue/cli 查看版本/是否安装成功 vue -V 如果你仍然需要使用旧版本的 ...
- centos7下安装docker(26如何配置Health Check)
Docker只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行状况基本没有了解 执行docker run命令时,通常根据dockerfile中的CMD或ENTRYPOINT启动一个进程, ...
- P1256 显示图像(广搜)
题意:略 思路,先说如何建树吧.广搜很简单,就是一个队列+一个检测数组.但是本质还是对搜索树的构建. 这里的构建就是一个节点有4个孩子,每个孩子代表4个方向就构成了一个搜索树.根据题目的就离公式转化一 ...
- day14(2)---列表推导式、生成器推导式、字典推导式、三元表达式
一.列表推导式: ls = [元素表达式 for i in 可迭代对象 if 筛选条件] 案例: # -*- coding: utf-8 -*- '''列表生成式练习''' # 练习一(三元表达式): ...
- 用return关键字实现1——100累加求和,返回总和并接收输出
package com.Summer_0419.cn; /** * @author Summer * 用return关键字实现1——100累加求和,返回总和并接收输出 */ public class ...
- Feature Extractor[DenseNet]
0.背景 随着CNN变得越来越深,人们发现会有梯度消失的现象.这个问题主要是单路径的信息和梯度的传播,其中的激活函数都是非线性的,从而特别是乘法就可以使得随着层数越深,假设将传统的神经网络的每一层看成 ...
- linux if -d -e -f表达的意思
文件表达式-e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则为真-L ...