Socket.io+Nodejs通讯实例---流程梳理

本文介绍了一个使用 Socket.IO 实现的简单示例,包括服务端与客户端的搭建过程。该示例展示了客户端如何发送消息给服务端,服务端如何响应客户端,并在客户端离开时通知服务端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

具体源码:Socket

目录结构
D:.
│ package.json
│ server.js

└─public
index.html
socket.io.js

需要的条件


  • socket.io.js 供前端界面初始化io
  • socket.io 供NodeJs端提供socket方法

socket.io.js存在于socket.io-client

socket.io存在于socket.io

socket.io服务端API文档

socket.io-client客户端的API文档

演示的功能


  • 客户端发送消息给服务端

  • 后端触发事件告知客户端

  • 客户端离开触发服务端事件

服务端


server.js

var express = require('express'); 
var app = express();

var server = require('http').createServer(app);
var io = require('socket.io')(server);

app.use('/', express.static(__dirname + '/public')); 

server.listen(80);

//socket部分
io.on('connection', function(socket) {
    //接收并处理客户端的hi事件
    socket.on('hi', function(data) {
        console.log(data);

        //触发客户端事件c_hi
        socket.emit('c_hi','hello too!')
    })

    //断开事件
    socket.on('disconnect', function(data) {
        console.log('断开',data)
        socket.emit('c_leave','离开');
        //socket.broadcast用于向整个网络广播(除自己之外)
        //socket.broadcast.emit('c_leave','某某人离开了')
    })

});
  • connection用来处理socket链接事件
  • disconnect处理连接断开事件
  • 后端接受前端事件通过socket.on(EventName,function(date){})
  • 后端触发前端事件通过socket.emit(EventName,msg)

这个后端演示了,前端发送消息给后端,触发hi事件,hi事件通过回调在触发客户端定义的c_hi事件告知前端。

客户端


index.html

<!DOCTYPE html>
<html>

<head>
    <title>socket</title>
</head>

<body>


<button id="sendBtn">发送消息</button>

<button id="leaveBtn">离开</button>

</body>
<script type="text/javascript" src="./socket.io.js"></script>
<script type="text/javascript">
    var socket=io.connect('localhost:80'),//与服务器进行连接
        send=document.getElementById('sendBtn'),
        leave=document.getElementById('leaveBtn');

    send.onclick=function(){
        socket.emit('hi', 'hello!');
    }

    leave.onclick=function(){
        window.location.href="about:blank";
        window.close()
        socket.emit('leave', 'leave');
    }

    //接收来自服务端的信息事件c_hi
    socket.on('c_hi',function(msg){
        alert(msg)
    })

    // socket.on('c_leave',function(msg){
    //     alert(msg)
    // })

</script>

</html>

  • 发送消息按钮用来给服务端发送信息,触发服务端定义的hi事件。
  • 离开页面按钮用来离开页面,也就是socket会自动断开。触发服务端定义的disconnect。

### 集成并使用 Socket.IO 和 Vue 实现实时通信 为了实现基于 Vue 的前端应用与后端之间的实时通信,可以利用 **Socket.IO** 提供的强大功能来处理 WebSocket 协议。以下是关于如何在 Vue 项目中集成和使用 Socket.IO 的详细介绍。 #### 1. 安装必要的依赖项 首先,在 Vue 项目中安装 `socket.io-client` 库作为客户端库用于连接到服务器上的 Socket.IO 实例。 ```bash npm install socket.io-client --save ``` #### 2. 创建 Socket.IO 客户端服务 创建一个新的文件夹结构或者单独的服务类用来管理所有的套接字操作逻辑。例如: ##### 文件路径:`src/services/socketService.js` ```javascript import io from 'socket.io-client'; const setupSocketConnection = () => { const socket = io('http://localhost:3000'); // 替换为实际的服务器地址[^1] return new Promise((resolve, reject) => { try { resolve(socket); } catch (error) { reject(error); } }); }; export default { setupSocketConnection }; ``` 此代码片段定义了一个函数 `setupSocketConnection()` 来初始化与指定 URL 上运行的远程节点服务器之间的一个新套接字实例。 #### 3.Socket.IO 整合至 Vue 组件 通过引入上述创建好的服务模块,并将其绑定给 Vue 数据模型或其他响应式属性上以便于访问事件监听器以及发送消息等功能。 下面展示的是一个简单的例子,其中展示了如何在一个按钮点击时向服务器广播一条信息,同时也注册了一些基本的消息接收处理器。 ##### 示例组件:`ChatComponent.vue` ```html <template> <div class="chat-container"> <ul id="messages"></ul> <input v-model="messageText" placeholder="Type your message here..." /> <button @click="sendMessage">Send</button> </div> </template> <script> import socketService from '../services/socketService'; let socket; export default { data() { return { messageText: '' }; }, methods: { async sendMessage() { if (!this.messageText.trim()) return; await this.socket.emit('new_message', { text: this.messageText }); // 发送消息给服务器 this.messageText = ''; } }, mounted() { socketService.setupSocketConnection().then(sckt => { socket = sckt; // 添加全局变量方便其他方法调用 Object.defineProperty(this, '$socket', { value: socket }); // 订阅来自服务器的新消息通知 socket.on('receive_message', msg => { console.log(`Received Message: ${msg}`); document.getElementById('messages').innerHTML += `<li>${msg}</li>`; }); }).catch(err => alert(`Failed to connect to server due to error: ${err}`)); } }; </script> ``` 在此模板中,我们绑定了输入框的内容到 `v-model` 中的数据字段 `messageText` ,并通过按钮触发的方法 `sendMessage()` 向服务器发出新的聊天消息。当收到由服务器推送过来的信息时,则会动态更新页面中的列表显示这些最新内容。 #### 4. 设置 Node.js + Express + Socket.IO 服务器端环境 最后一步就是搭建好能够接受来自多个用户的请求并与之交互的实际后台程序了。这里给出一段简化版的NodeJs+Express框架配合SocketIO使用的样例代码如下所示: ##### 文件路径:`server/index.js` ```javascript const express = require('express'); const http = require('http'); const socketIo = require('socket.io'); // 初始化express app & HTTP server instance. const app = express(); app.use(express.static(__dirname + '/public')); const server = http.createServer(app); // Initialize Socket.IO passing our existing HTTP server object into it's constructor function. const io = socketIo(server); io.on('connection', client => { console.log('New Client Connected.'); // Listen for incoming messages sent via emit calls made within clientside codebase. client.on('new_message', ({text})=>{ broadcastMessageToAllClients(text); }); // Helper method used internally only inside of this file scope. function broadcastMessageToAllClients(message){ io.sockets.emit('receive_message', message); } }); // Start listening on port number defined below or fallback onto process.env.PORT variable instead. const PORT = process.env.PORT || 3000 ; server.listen(PORT ,()=>{console.log(`Listening On Port Number:${PORT}.`)}); ``` 以上即完成了整个前后端联调过程概述说明文档. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值