nodejs和前端基于websocket实现微信群聊与私聊

WebSocket

websocket可以实现客户端与服务端数据的实时通信。(长连接)

网络通信过程中的长连接与短连接

HTTP协议是一款基于短连接模式的协议。意味着需要通信时,客户端向服务端发送连接请求,一旦连接建立,开始通信,接收响应,响应接收完毕后连接将断开。

短连接模式可以极大的节省服务端资源(CPU、内存、连接数)。

websocket属于长连接,意味着需要通信时,客户端向服务端发送websocket连接请求,一旦连接建立成功,两端通信的过程中连接不断开。这个过程中,双方都可以自发的向对方发消息,对方可以实时接收这些消息。

例如:即时通讯、游戏等。

长连接模式可以实现实时通信,但是会长时间占用服务端资源。在做技术选型时可以尝试使用短连接的http协议发送心跳包,模拟长连接的功能。

什么是websocket

websocket是一种在单个TCP连接上进行**全双工通信(通信过程中允许两个方向同时进行数据传输)**的一种通信协议。是一款长连接协议。它具备数据包格式小,通信高效、既可以发送文本,又可以发送二进制的特点。

如何使用代码建立websocket连接并实现实时通信?

socket.io

socket.io是一个为浏览器与服务器之间提供实时的、双向的、基于事件通信的网络通信库。实现了webosocket协议,提供了相关API,抹平了一些技术细节及兼容性。

导入socket.io.js
io('ws://ip:port/')   //建立websocket连接
require('socket.io')
serversocket.on('connection', (client)=>{
	连接成功
})
建立websocket连接
客户端
  1. html引入socket.io.js

    <script src="socket.io.js"></script>
    
    
  2. 调用socket.io提供的方法,试图建立连接:

    <script>
        // socket:套接字 
        // 封装了与服务端进行交互的属性和方法
    	let socket = io('ws://localhost:3000/');
    </script>
    
服务端

websocket服务是挂载在web服务基础之上的。也就是说weboscket是内嵌在一个express服务内部的。express将启用3000端口提供普通的web服务。具体步骤如下:

  1. 新建一个nodejs项目,安装expresssocket.io等模块。

    # 必须进入serversocket项目目录下,执行安装命令:
    npm init
    npm install --save express
    npm install --save socket.io
    
  2. 新建index.js,引入expresssocket.io

  3. 基于socket.io接收客户端的websocket连接。

    // socketserver/index.js 
    const express = require('express');
    const app = express();
    // 获取express底层的http服务
    const http = require('http').createServer(app);
    // 加载socket.io模块时 把路由挂载到底层的的http服务之上
    const serversocket = require('socket.io')(http);
             
    // 设置public目录为静态资源托管目录
    app.use(express.static('public'));
             
    // 监听客户端的websocket连接,一旦有客户端连接,就会触发
    // ‘connection’事件,编写事件处理函数处理该事件即可。
    // 在事件处理函数中将自动传入与客户端交互所需要的socket对象
    serversocket.on('connection', (socket)=>{
      console.log('有客户端进来了:'+socket.id);
    })
             
    http.listen(3000, ()=>{
      console.log('server is running...');
    })
             
    
客户端与服务端之间进行通信
客户端向服务端发消息

客户端发送:

let socket = io('ws://localhost:3000/');
// socket.emit(key, value);
socket.emit('textmsg', '你瞅啥?');

服务端接收:

serversocket.on('connection', (socket)=>{
  console.log('有客户端进来了:'+socket.id);
  // 通过socket对象接收客户端发来的消息
  // socket.on(key, callback)
  socket.on('textmsg', function(res){
      console.log(res);
  })
})
服务端向客户端发消息

服务端:

socket.on('textmsg', function(res){
    console.log(res);
    // 给当前socket客户端回复消息
    socket.emit('textmsg', '丑你咋地!');
})

客户端:

let socket = io('ws://localhost:3000/');
socket.on('textmsg', (res)=>{
    console.log(res);
})
服务端向所有客户端广播消息

服务端:

serversocket.on('connection', (socket)=>{
  console.log('有客户端进来了:'+socket.id);
  serversocket.emit('textmsg', '内容'); // 给所有客户端都发消息
})

实现群聊天室

需求如下:

  1. 在聊天界面中建立websocket连接。

  2. 一个客户端在消息发送区发送消息,服务端接收消息后把该消息分发给所有客户端。

  3. 客户端接收服务端发回来的消息,打印。

  4. 接收到的消息,上屏。

  5. 更新当前在线人数。

    1. 在服务端存储一个全局的变量count。用于保存当前在线人数,默认值:0。
    2. 一旦有客户端连接进来,count++
    3. 一旦有连接断开,count--
    4. 一旦服务端count有变化,就向所有客户端发个消息,告诉它们最新的count的值,客户端接收到最新的count后更新界面。
  6. 实现登录业务。在index.html填写昵称后点击登录,跳转到chart.html。把用户昵称和头像文件名都传递过来。

    window.location="chart.html?name=东东&avatar=1.jpg"
    
  7. 在发消息时,带着用户信息一起发送消息:

    emit('textmsg', 
    	 {
             name:'zs', 
             avatar:'1.jpg', 
             content:'xxxx'
    	 }
    )
    
    私聊

    实现思路:

    1. 客户端发消息时,除了contentnameavatar之外还需要发送to(对方的昵称)

      {
      	name: '亮亮',
      	avatar: '16.jpg',
      	content: '你最近还好吗?我好想你',
      	to: '东东'
      }
      
    2. 服务端接收消息后,判断到底给谁发,需要找到与对方交互时所必须的socket对象(前提是所有用户连接成功后,把这些socket对象都得存起来)。调用该socket对象的emit即可完成私聊。

React前端和Node.js后端之间使用WebSocket连接的方法如下: 1在Node.js服务器端安装websocket库: ```bash npm install websocket ``` 2.在Node.js服务器端创建WebSocket服务器: ```javascript const WebSocket = require('websocket').server; const http = require('http'); const server = http.createServer(function(request, response) { // 处理HTTP请求 }); server.listen(8080, function() { console.log((new Date()) + ' Server is listening on port 8080'); }); wsServer = new WebSocket({ httpServer: server }); // 处理WebSocket连接 wsServer.on('request', function(request) { const connection = request.accept(null, request.origin); console.log('WebSocket connection accepted.'); // 处理WebSocket消息 connection.on('message', function(message) { if (message.type === 'utf8') { console.log('Received Message: ' + message.utf8Data); connection.sendUTF('Hi this is WebSocket server!'); } }); // 处理WebSocket关闭 connection.on('close', function(reasonCode, description) { console.log('WebSocket connection closed.'); }); }); ``` 在此示例中,我们使用了Node.js的HTTP模块和WebSocket库。我们创建了一个HTTP服务器,并将WebSocket服务器绑定到该服务器上。当收到WebSocket连接请求时,我们将打印一条消息,当接收到WebSocket消息时,我们将回复一个消息。当WebSocket连接关闭时,我们将打印一条消息。 3.在React前端中使用WebSocket连接: ```javascript import React, { Component } from 'react'; import logo from './logo.svg'; import './App.css'; import WebSocket from 'websocket'; class App extends Component { constructor(props) { super(props); this.state = { message: '', ws: null }; } componentDidMount() { // 创建WebSocket连接 const ws = new WebSocket('ws://localhost:8080'); ws.onopen = () => { console.log('WebSocket Client Connected'); }; ws.onmessage = (message) => { console.log('Received:', message.data); this.setState({ message: message.data }); }; ws.onclose = () => { console.log('WebSocket closed'); }; this.setState({ ws }); } render() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <h1 className="App-title">Welcome to React</h1> </header> <p className="App-intro"> {this.state.message} </p> </div> ); } } export default App; ``` 在React前端中,我们使用了WebSocket库来创建WebSocket连接。我们使用`componentDidMount`方法在组件挂载后创建WebSocket连接。当WebSocket连接打开时,我们将打印一条消息,当接收到WebSocket消息时,我们将更新组件状态以显示该消息。当WebSocket连接关闭时,我们将打印一条消息。 在React前端中,我们只需要提供WebSocket服务器的URL,即可建立WebSocket连接。在此示例中,我们将WebSocket服务器的URL设置为`ws://localhost:8080`,因为我们假设Node.js服务器运行在本地8080端口上。 以上是React前端和Node.js后端之间使用WebSocket连接的基本步骤,你可以根据自己的实际需求进行进一步的开发和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值