webscoket通信初步(一)
只要动手做起来,多投入时间和精力、耐心去研究,以大多人的智商加google,平时遇到的大部分问题我们都是可以自己解决的,大部分的知识我们都是可以掌握的。
我们都知道http协议是单向请求的,无法实现双向通信,它只能从客户端发送请求,然后服务端再响应请求,无法做到服务端主动向客户端去推送消息。
尽管可以通过setTimeout/setInterval轮询的方式来不断去刷新获取服务端的数据,但是轮询的效率低,非常浪费资源。webscoket就是为了解决这一问题而存在的。
webscoket的特点:
1、建立在Tcp协议之上
2、与http协议有着很好的兼容性
3、通信高效,因为它的数据格式比较轻量、性能开销小
4、可以发送文本和二进制数据
5、没有同源限制
6、协议标识符是ws
简单的通信原理如下
客户端的实现:
浏览器端的实现
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta http-equiv="X-UA-Compatible" content="ie=edge">
- <title>WebSocket</title>
- </head>
- <body>
- <h1>Echo Test</h1>
- <input id="sendTxt" type="text"/>
- <button id="sendBtn">发送</button>
- <div id="recv"></div>
- <script type="text/javascript">
- var WebSocket = new WebSocket("ws://localhost:8080");
- WebSocket.onopen = function(){
- console.log('websocket open');
- document.getElementById("recv").innerHTML = "Connected";
- }
- WebSocket.onclose = function(){
- console.log('websocket close');
- }
- WebSocket.onmessage = function(e){
- console.log(e.data);
- document.getElementById("recv").innerHTML = e.data;
- }
- document.getElementById("sendBtn").onclick = function(){
- var txt = document.getElementById("sendTxt").value;
- WebSocket.send(txt);
- }
- </script>
- </body>
- </html>
服务端实现:
nodejs搭建服务器,可以参考git上的《一起学nodejs》搭建服务器
文件目录下 npm install webscoket
- var WebSocketServer = require('websocket').server;
- var http = require('http');
- var server = http.createServer(function(request, response) {
- console.log((new Date()) + ' Received request for ' + request.url);
- response.writeHead(404);
- response.end();
- });
- server.listen(8080, function() {
- console.log((new Date()) + ' Server is listening on port 8080');
- });
- wsServer = new WebSocketServer({
- httpServer: server,
- // You should not use autoAcceptConnections for production
- // applications, as it defeats all standard cross-origin protection
- // facilities built into the protocol and the browser. You should
- // *always* verify the connection's origin and decide whether or not
- // to accept it.
- autoAcceptConnections: false
- });
- function originIsAllowed(origin) {
- // put logic here to detect whether the specified origin is allowed.
- return true;
- }
- wsServer.on('request', function(request) {
- if (!originIsAllowed(request.origin)) {
- // Make sure we only accept requests from an allowed origin
- request.reject();
- console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.');
- return;
- }
- var connection = request.accept('', request.origin);
- console.log((new Date()) + ' Connection accepted.');
- connection.on('message', function(message) {
- if (message.type === 'utf8') {
- console.log('Received Message: ' + message.utf8Data);
- connection.sendUTF(message.utf8Data);
- }
- else if (message.type === 'binary') {
- console.log('Received Binary Message of ' + message.binaryData.length + ' bytes');
- connection.sendBytes(message.binaryData);
- }
- });
- connection.on('close', function(reasonCode, description) {
- console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
- });
- });
参考资料:
客户端(浏览器端)实现参考阮一峰:http://www.ruanyifeng.com/blog/2017/05/websocket.html
webscoket通信初步(一)的更多相关文章
- win32 线程通信初步
// 线程通信机制.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #define NUM_THREADS 10 #include < ...
- 前端后端通信初步尝试(javascript - flask)
在某项目中,需要使用python flask做后端功能开发,web提供功能入口. 此时需要使用Ajax通信. 由于以前从未接触过网络传输,记录了一些基础知识. 资料参考<HTML5+CSS3+J ...
- 阿里云负载不支持 WebSocket 协议与 WSS 和 Nginx 配置问题
WebSocket 是 HTML5 下一种新的协议.它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的.它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTT ...
- node的socket.io类库概述
socket.io是一个简单的小类库,该类库实现的功能类似于node中的net模块所实现的功能. 这些功能包括websocket通信,xhr轮询,jsonp轮询等. socket类库可以接受所有与服务 ...
- Netty之WebSocket和四种IO介绍
Netty简介 一.什么是netty? 高性能 事件驱动 异步非堵塞 基于NIO的客户端,服务器端编程框架 稳定性和伸缩性 二.Netty的使用场景 高性能领域 多线程并发领域 异步通信领域 ...
- VsCode插件开发之插件初步通信
参考了Egret Wing,想像Egret Wing那样在上方titlebar最右边上面增加一个menu(这个menu相对于一个按钮,当点击这个按钮时会出现一个window弹框,这个window弹框里 ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- Azure底层架构的初步分析
之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...
- webScoket的浅短的认识
在一般的发送数据请求的时候都是用的http协议,但是对于类似即时聊天,需要客户端与服务器不间断的交互的时候对于http协议来说就不太适用了.因为http协议无法主动把数据发到客户端,而且客户端发送请求 ...
随机推荐
- 管道符和作业 shell变量 环境变量
管道符 | 前一个命令的输出,变成后一个命令的输入 ctrl +z 暂停 bg cmd 后台运行 fg # 调回前台 直接让程序进入后台,可以在后面加上 cmd &am ...
- QuickSort(Java)
private void quickSort(int[] input, int start, int end) { if (start >= end) return; int index = p ...
- CTF—训练平台——Crypto
一.滴答~滴 看形式是摩尔斯电码,放到解密网址里解密http://www.jb51.net/tools/morse.htm 二.聪明的小羊 看到题目里“栅栏”,“2个”想到是栅栏加密:栏数为两栏: 三 ...
- hello1分析
1:选择hello1文件夹并单击“打开项目”.展开“Web页”节点,然后双击该index.xhtml文件以在编辑器中查看它. 该index.xhtml文件是Facelets应用程序的默认登录页面.在典 ...
- day 06Hadoop
更换虚拟机以后操作的步奏1.到每一台机器上修改ip地址 ,然后修改hosts1.5 给每台机器配置免密码登录 2.修改hadoop 的配置文件,发送到每台机器上3.启动dfs start-dfs.sh ...
- 多线程线性 lock
有时我们lock一段代码或许要根据某个变量的值,值相同则不允许有两个或以上的方法并行运行,我在工作中就遇到了,有100个值,相同的参数值不能并行运行. 还有就是一个被lock的方法递归调用会不会死锁, ...
- MongoDB的真正性能-实战百万用户
阅读目录 一.第一个问题:Key-Value数据库可以有好多的Key,没错,但对MongoDB来说,大错特错 二.第二个问题:FindOne({_id:xxx})就快么? 三.第三个问题:精细的使用U ...
- VS版本号定义、规则和相关的Visual Studio插件
软件版本号主要标识了软件的版本,通过其可以了解软件.类库文件的当前版本,使得软件版本控制有所依据. 我们就Windows系统和.NET Framework的编号规则来看,软件版本号的定义结构一般是这样 ...
- Pycharm主题设置以及导入方式
主题下载链接: http://www.themesmap.com/ pycharm -- 导入主题(theme) and 修改背景颜色(护眼色) 前情提要 众所周知,随着python语言的不断流行 ...
- 两个简单的API限流实现方案
1, Ngnix限流 Nginx在架构中起到请求转发与负载均衡器的作用.外部req首先到Nginx监听的80端口,然后Nginx将req交给到监听8080端口的APP服务器处理.处理结果再经由Ngin ...