初识WebSocket:

  index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>初识WebSocket</title>
  6. </head>
  7. <body>
  8. <div style="margin-top: 30px;margin-left:30px">
  9. <input type="text" id="info">
  10. <button id="send">send</button>
  11. <div id="notice"></div>
  12. <div id="msg"></div>
  13. </div>
  14. </body>
  15. <script>
  16. var info = document.getElementById("info");
  17. var send= document.getElementById("send");
  18. var notice = document.getElementById("notice");
  19. var msg = document.getElementById("msg");
  20.  
  21. var ws = new WebSocket("ws://echo.websocket.org/");
  22. ws.onopen = function(){
  23. notice.innerHTML = "connected";
  24. }
  25. ws.onclose = function(){
  26. notice.innerHTML = "closed"
  27. }
  28. ws.onmessage = function(res){
  29. console.log(res);
  30. msg.innerHTML = res.data;
  31. }
  32. send.onclick = function(){
  33. ws.send(info.value)
  34. }
  35. </script>
  36. </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

  1. var ws = require("nodejs-websocket")
  2.  
  3. var port = 8001;
  4. var server = ws.createServer(function (conn) {
  5. console.log("New connection");
  6. //收到数据进行的操作
  7. conn.on("text", function (str) {
  8. console.log("Received "+str);
  9. conn.sendText(str.toUpperCase()+"!!!");
  10. });
  11. //关闭连接进行的操作。
  12. conn.on("close", function (code, reason) {
  13. console.log("Connection closed");
  14. });
  15. });
  16. server.listen(port)
  17. console.log("websocket started , listening " + port)

  使用node server.js来运行搭建的服务器。

  然后,将前面第一个index.html中的ws://echo.websocket.org/,替换为ws://localhost:8001即可,然后即可访问index.html进行操作了。

  

有点问题

  上面这个js程序刚开始是可以正常运行的,但是,一旦浏览器进行刷新操作或者关闭了窗口,那么node就会报错,自己搭建的服务器就会崩溃,提示下面的信息:

  1. websocket started , listening 8001
  2. New connection
  3. Connection closed
  4. events.js:183
  5. throw er; // Unhandled 'error' event
  6. ^
  7. Error: read ECONNRESET
  8. at _errnoException (util.js:1022:11)
  9. at TCP.onread (net.js:628:25)

  从上面的信息可以看到出错原因是因为没有为error事件绑定handle函数。

  可以看一下这个:event-errorerrobj

  解决方法就是稍加修改一下上面的server.js

  1. var ws = require("nodejs-websocket")
  2.  
  3. var port = 8001;
  4. var server = ws.createServer(function (conn) {
  5. console.log("New connection");
  6. //收到数据进行的操作
  7. conn.on("text", function (str) {
  8. console.log("Received "+str);
  9. conn.sendText(str.toUpperCase()+"!!!");
  10. });
  11. //关闭连接进行的操作。
  12. conn.on("close", function (code, reason) {
  13. console.log("Connection closed");
  14. });
  15. //出现错误进行的操作,比如客户端刷新网页、关闭窗口等
  16. conn.on("error", function(err){
  17. console.log("some accident happend");
  18. console.log(err);
  19. });
  20. });
  21.  
  22. console.log("websocket started , listening " + port)
  23. server.listen(port)

  重新使用node server.js启动服务器,再次访问index.html,进行刷新或者关闭窗口时,服务器都不会崩溃了,服务器后台输出内容如下:

  1. websocket started , listening 8001
  2. New connection
  3. Received demo
  4. Connection closed
  5. some accident happend
  6. { Error: read ECONNRESET
  7. at _errnoException (util.js:1022:11)
  8. at TCP.onread (net.js:628:25) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
  9. New connection
  10. Received haha
  11. Connection closed
  12. some accident happend
  13. { Error: read ECONNRESET
  14. at _errnoException (util.js:1022:11)
  15. at TCP.onread (net.js:628:25) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }

  

发送广播消息

  要发送广播,首要问题就是:需要知道所有连接中的客户端。

  node.js-websocket模块中有办法获得,详情参考server.connections

  1. function broadcast(server, msg) {
  2. server.connections.forEach(function (conn) {
  3. conn.sendText(msg)
  4. })
  5. }

  

学习WebSocket的更多相关文章

  1. 如何学习 websocket ?

    如何学习 websocket ? 使用 HTML https://github.com/phoboslab/jsmpeg MPEG1 进行播放 https://w3c.github.io/media- ...

  2. 学习WebSocket(二):使用Spring WebSocket做一个简单聊天室

    聊天室高频率.低延时完全符合websocket的特点,所以聊天室使用websocket再适合不过了. 聊天室的功能并没有比上一节代码多多少,主要在握手阶段对用户的session做处理,对用户的消息进行 ...

  3. 学习WebSocket(一):Spring WebSocket的简单使用

    1.什么是websocket? WebSocket协议定义了一种web应用的新功能,它实现了服务器端和客户端的全双工通信.全双工通信即通信的双方可以同时发送和接收信息 的信息交互方式.它是继Java ...

  4. 通讯框架 t-io 学习——websocket 部分源码解析

    前言 前端时间看了看t-io的websocket部分源码,于是抽时间看了看websocket的握手和他的通讯机制.本篇只是简单记录一下websocket握手部分. WebSocket握手 好多人都用过 ...

  5. 学习WebSocket一(WebSocket初识)

    Java EE 7 去年刚刚发布了JSR356规范,使得WebSocket的Java API得到了统一,Tomcat从7.0.47开始支持JSR356,这样一来写WebSocket的时候,所用的代码都 ...

  6. 学习WebSocket笔记

    由于HTTP协议是无状态的,服务器只会响应来自客户端的请求,但是它与客户端之间不具备持续连接. 当用户在浏览器上进行操作时,可以请求服务器上的api:但是反过来不可以:服务端发生了一件事,无法将这个事 ...

  7. WebSocket 学习(三)--用nodejs搭建服务器

    前面已经学习了WebSocket API,包括事件.方法和属性.详情:WebSocket(二)--API  WebSocket是基于事件驱动,支持全双工通信.下面通过三个简单例子体验一下. 简单开始 ...

  8. WebSocket学习笔记——无痛入门

    WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报  分类: 物联网学习笔记(37)  版权声明:本文为博主原 ...

  9. websocket学习和群聊实现

    WebSocket协议可以实现前后端全双工通信,从而取代浪费资源的长轮询.在此协议的基础上,可以实现前后端数据.多端数据,真正的实时响应.在学习WebSocket的过程中,实现了一个简化版群聊,过程和 ...

随机推荐

  1. 【PAT】B1011 A+B 和 C

    注意数据的范围,使用long long就行了 #include<stdio.h> int main(){ int N;scanf("%d",&N); for(i ...

  2. 【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一

    参考资料及致谢 本文的绝大部分内容转载自以下几篇文章,首先向原作者致谢,希望自己能在这些前辈们的基础上能有所总结提升. 1. 运动规划/路径规划/轨迹规划的联系与区别 https://blog.csd ...

  3. Python里面search()和match()的区别

    转自https://www.cnblogs.com/aaronthon/p/9435967.html match()函数只检测字符串开头位置是否匹配,匹配成功才会返回结果,否则返回None searc ...

  4. vue-cli3安装创建项目以及目录结构

    安装脚手架cli3.0 全局安装 npm install -g @vue/cli 或 yarn global add @vue/cli 查看版本/是否安装成功 vue -V 如果你仍然需要使用旧版本的 ...

  5. centos7下安装docker(26如何配置Health Check)

    Docker只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行状况基本没有了解 执行docker run命令时,通常根据dockerfile中的CMD或ENTRYPOINT启动一个进程, ...

  6. P1256 显示图像(广搜)

    题意:略 思路,先说如何建树吧.广搜很简单,就是一个队列+一个检测数组.但是本质还是对搜索树的构建. 这里的构建就是一个节点有4个孩子,每个孩子代表4个方向就构成了一个搜索树.根据题目的就离公式转化一 ...

  7. day14(2)---列表推导式、生成器推导式、字典推导式、三元表达式

    一.列表推导式: ls = [元素表达式 for i in 可迭代对象 if 筛选条件] 案例: # -*- coding: utf-8 -*- '''列表生成式练习''' # 练习一(三元表达式): ...

  8. 用return关键字实现1——100累加求和,返回总和并接收输出

    package com.Summer_0419.cn; /** * @author Summer * 用return关键字实现1——100累加求和,返回总和并接收输出 */ public class ...

  9. Feature Extractor[DenseNet]

    0.背景 随着CNN变得越来越深,人们发现会有梯度消失的现象.这个问题主要是单路径的信息和梯度的传播,其中的激活函数都是非线性的,从而特别是乘法就可以使得随着层数越深,假设将传统的神经网络的每一层看成 ...

  10. linux if -d -e -f表达的意思

    文件表达式-e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则为真-L ...