Node.js 网络通信(二)01-构建TCP服务——TCP全名为传输控制协议,属于传输层协议,如http协议 & 显著特征是在传输之前需要三次握手形成会话 & Socket通信模型

Node.js 网络通信(二)01-构建TCP服务——TCP全名为传输控制协议,属于传输层协议,如http协议 & 显著特征是在传输之前需要三次握手形成会话 & Socket通信模型

第2章 构建 TCP 服务

TCP 服务在网络应用中十分常见,目前大多数的应用都是基于TCP搭建而成的。

TCP 全名为传输控制协议,在 OSI 模型(由七层模型,分别为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)中属于传输层协议。许多应用层协议基于TCP构建,典型的是HTTP、SMTP、IMAP等协议。

七层协议示意图如下:

层级 作用
应用层 HTTP、SMTP、IMAP等
表示层 加密/解密等
会话层 通信连接/维持会话
传输层 TCP/UDP
网络层 IP
链路层 网络特有的链路接口
物理层 网络物理硬件

TCP 是面向连接的协议,其显著的特征是在传输之前需要3次握手形成会话,如下图所示

在这里插入图片描述

只有会话形成之后,服务器端和客户端之间才能互相发送数据。在创建会话的过程中,服务器端和客户端分别提供一个套接字,这个两个套接字共同形成一个连接。服务器端与客户端则通过套接字实现两者之间连接通信的操作。下面是一个基于 Socket 套接字编程的网络通信模型。

在这里插入图片描述

基本示例

服务端:

const net = require('net');
const server = net.createServer((c) => {
    
    
  // 'connection' listener
  console.log('client connected');
  c.on('end', () => {
    
    
    console.log('client disconnected');
  });
  c.write('hello\r\n');
  c.pipe(c);
});
server.on('error', (err) => {
    
    
  throw err;
});
server.listen(8124, () => {
    
    
  console.log('server bound');
});

客户端:

const net = require('net');
const client = net.createConnection({
    
     port: 8124 }, () => {
    
    
  // 'connect' listener
  console.log('connected to server!');
  client.write('world!\r\n');
});
client.on('data', (data) => {
    
    
  console.log(data.toString());
  client.end();
});
client.on('end', () => {
    
    
  console.log('disconnected from server');
});

相关 API

官方API文档:https://nodejs.org/dist/latest-v10.x/docs/api/net.html

服务端相关 API

Class: net.Server

套接字 Socket 相关 API

Class: net.Socket

其它 API

案例:聊天室

初始化

核心需求

  • 用户第一次进来,提示用户输入昵称进行注册
    • 昵称不允许重复
  • 广播消息(群发)
  • 用户昵称
  • 点对点消息(私聊)

数据格式设计(语言协议)

  • 什么是数据格式
    • 数据格式(data format)是描述数据保存在文件或记录中的规则。可以是字符形式的文本格式,或二进制数据形式的压缩格式
  • 为什么要进行数据格式设计
  • 比较常见的数据传输格式
    • JSON
    • XML
    • YAML

用户登录

客户端:

{
    
    
  "type": "login",
  "nickname": "xxx"
}

服务端:

{
    
    
  "type": "login",
  "success": true | false,
  "message": "登录成功|失败",
  "sumUsers": 10
}

广播消息

客户端:

{
    
    
  "type": "broadcast",
  "message": "xxx"
}

服务端:

{
    
    
  "type": "broadcast",
  "nickname": "xxx",
  "message": "xxx"
}

点对点消息

客户端:

{
    
    
  "type": "p2p",
  "to": "xxx",
  "message": "xxx"
}

服务端:

{
    
    
  "type": "p2p",
  "from": "xxx",
  "to": "xxx",
  "message": "xxx"
}

上线|离线通知日志

服务端:

{
    
    
  "type": "log",
  "message": "xxx 进入|离开了聊天室,当前在线人数:xx"
}

用户登录

  • 客户端输入昵称发送到服务端
  • 服务端接收数据,校验昵称是否重复
    • 如果已重复,则发送通知告诉客户端
    • 如果可以使用,则将用户昵称及通信 Socket 存储到容器中用于后续使用

群发消息

  • 客户端输入消息发送到服务端
  • 服务端将消息发送给所有当前连接(也就是存储客户端Socket的容器)的客户端
  • 客户端收到消息,将消息输出到终端

私聊

  • 客户端输入消息发送到服务端
  • 服务端根据消息内容从容器中找到对应的通信客户端,然后将消息发送给该客户端
  • 对应的客户端收到消息,将消息输入到终端

上线|离线通知

  • 上线通知
  • 离线通知

总结

  • TCP 必须建立连接(三次握手建立连接)才能通信

在这里插入图片描述

  • TCP 只是负责数据的传输,不关心传输的数据格式问题
{
    
    
  "type": "xxx"
}
  • 如果需要使用 TCP 通信完成某种功能,则需要制定数据格式协议,或者使用第三方协议
  • Socket 就是与之通信的另一端,通过 Socket 接收或是发送数据
  • Socket 通信模型

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44867717/article/details/131218837