基于node的websocket学习笔记一:基础概念和第一个websocket应用demo示例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38355456/article/details/78448886

一、基本概念

首先要知道什么是几个常用的互联网传输协议:http、https、tcp、udp

http:超文本传输协议(HyperText Transfer Protocol)是一种无状态协议,就是说客户端发送一次请求,服务器端接收请求,经过处理返回给客户端信息,然后客户端和服务器端的链接就断开了。

HTTPS:(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

优点: 协议较成熟,应用广泛、基于TCP/IP,拥有TCP优点、研发成本很低,开发快速、开源软件较多,nginx,apache,tomact等

缺点: 无状态无连接、只有PULL模式,不支持PUSH、数据报文较大

特性: 基于TCP/IP应用层协议、无状态,无连接、支持C/S模式、适用于文本传输


TCP:(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂。建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。

优点: 可靠性 、全双工协议、开源支持多、应用较广泛、面向连接、研发成本低、报文内容不限制(IP层自动分包,重传,不大于1452bytes)缺点: 操作系统:较耗内存,支持连接数有限、设计:协议较复杂,自定义应用层协议、网络:网络差情况下延迟较高、传输:效率低于UDP协议特性: 面向连接、可靠性、全双工协议、基于IP层、OSI参考模型位于传输层、适用于二进制传输


UDP:UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

优点: 操作系统:并发高,内存消耗较低、传输:效率高,网络延迟低、传输模型简单,研发成本低

缺点: 协议不可靠、单向协议、开源支持少、报文内容有限,不能大于1464bytes、设计:协议设计较复杂、网络:网络差,而且丢数据报文

特性:无连接,不可靠,基于IP协议层,OSI参考模型位于传输层,最大努力交付,适用于二进制传输


webSocket:WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

优点:协议较成熟、基于TCP/IP,拥有TCP优点、数据报文较小,包头非常小、面向连接,有状态协议、开源较多,开发较快

缺点:没发现啥缺点

特性:有状态,面向连接、数据报头较小、适用于WEB3.0,以及其他即时联网通讯


对于通信协议选择方面:

大多数互联网web网页项目,都是选择的http/https协议。

实时性对战较高的互联网游戏,聊天程序,异步通知等应用,大多数都是选择websocket,其次是TCP协议。

局域网对战,赛车等大量数据交互,要求传输速度快,并发量高的,直接上UDP协议。


二、一个最基础的node服务websocket示例

1、html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webSocet</title>
</head>
<body>

<h1>Echo Test</h1>

<input type="text" id="sendTxt">
<button id="sendBtn">发送</button>

<div id="recv"></div>

<script>
    //建立连接
    let webSocket = new WebSocket('ws://localhost:8001/');

    //开启连接
    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 text = document.getElementById('sendTxt').value;
        webSocket.send(text);
    };

</script>

</body>
</html>

2、建立node socket服务

首先介绍一个node的一个websocket服务插件:nodejs-websocket

首先安装模块npm install nodejs-websocket

接下新建一个server.js的文件,写入一下代码来实现socket逻辑,代码如下:

var ws = require("nodejs-websocket")

// Scream server example: "hi" -> "HI!!!"
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('throw : err');
        console.log(err);
    })
}).listen(8001);

console.log('webSocket server listening on port 8001');
这里需要一个错误信息处理,因为如果页面突然关闭,在链接还没有关闭的情况下,我们的服务会抛出异常的。

启动服务后可以直接访问页面。我们的第一个websocket 示例完成。



猜你喜欢

转载自blog.csdn.net/qq_38355456/article/details/78448886