node+socket.io 实现一个聊天室

我们只做简单的实现,不接入数据库,nodejs也不使用express和koa等框架

因此依赖只有两个:

1、socket.io

2、mime(用于获取静态资源时获取文件的mime类型)

 

安装命令:

npm install socket.io mime --save

其他的就不赘述了

 

先描述一下文件目录结构

静态 js 和 css 文件放在 public 下面的相应目录下

socket连接是基于tcp的因此需要给socket传入一个http服务的实例,这样就能启动socket服务

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

server.listen(3001);

当然,socket.io不止提供了一种启动方式,这里就不一一列举了

 

socketio(server) 返回的是一个 socket 实例,通过这个实例可以监听客户端的 connection事件,事件监听的第二个参数是一个回调函数,会掉函数也会返回一个socket对象,这个 socket 对象可以监听这个链接的另一端触发的事件(这里就是客户端)

这里需要搞清楚的一点是,每个socket连接都会在 connection 事件的回调中返回一个socket 对象,这个对象可监听对应客户端触发的事件,也可以向其他的socket对象广播消息

 

通过connection 事件返回的 socket 对象触发和监听事件:

io.on('connection', function(socket) {
    // 监听客户端发送的message事件
    socket.on('message', function() {
        // 向同一个房间中的其他用户广播消息
        socket.broadcast.to(message.room).emit('message', {
            text: nickNames[socket.id] + ': ' + message.text
        });
        
    });

    // 触发事件
    socket.emit('message', {
        nick: 'Lily',
        content: 'hello world!'
    });
});

现在我们知道了如何在服务端创建socket 服务,那么客户端应该应该怎么和服务端的socket服务创建连接呢?

 

html页面引入的其他 js 文件这里就不说了,这里需要说明的是socket.io.js:

<script src="/socket.io/socket.io.js"></script>

我刚开始的时候也是很疑惑,因为这个文件在我的服务其中根本不存在。事实是,这个文件是socket 服务器启动后自动生成的。因此我们只需要在html文件中按照这个路径引入就行了。

引入socket.io.js 后就会有一个全局的 io 对象,用于触发事件和监听服务器 socket 服务器触发的事件

客户端事件监听:

var socket = io.connect();

$(document).ready(function() {
    // 监听服务器发送的事件
    socket.on('message', function(message) {
        var newElement = $('<div class="msg-box"></div>').append($('<span></span>').text(message.text));

        $('#messages').append(newElement);
    });

});

客户端触发事件:

socket.emit('message', {
    nick: 'Lily',
    content: 'yes! I hear you now'
});

message可以是对象也可以是字符串

这样建立连接设置监听后就可以和服务端通过事件进行通信了

服务端监听到客户端发来的消息后向该房间所有用户广播消息:

socket.broadcast.to(currentRoom[socket.id]).emit('message', {
    text: previousName + ' 现在已更名为 ' + name + '.'
});

结合以上描述的这些方法,就能完整搭建一个聊天室了,关于前端页面的结构和页面事件的逻辑我这里就不详细说了

我把我的demo放到了github上,有兴趣的同学可以看看:https://github.com/SailorCai/node-socket

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,要使用Node.js和Socket.io搭建一个基本的聊天,可以参考以下步骤: 1. 安装Node.js和npm 2. 创建一个新的Node.js项目并在项目文件夹里打开命令行 3. 在命令行中输入以下命令来安装Socket.io: ``` npm install socket.io ``` 4. 创建一个新的文件夹用于存放服务器端代码,我们称之为“server” 5. 在“server”文件夹中创建一个新的JavaScript文件,例如“server.js” 6. 在“server.js”中添加以下代码: ``` const io = require('socket.io')(); io.on('connection', (socket) => { console.log('a user connected'); socket.on('disconnect', () => { console.log('user disconnected'); }); }); io.listen(3000); ``` 7. 在命令行中进入“server”文件夹并运行“server.js”文件: ``` node server.js ``` 8. 创建一个新的文件夹用于存放客户端代码,我们称之为“client” 9. 在“client”文件夹中创建一个新的HTML文件,例如“index.html” 10. 在“index.html”中添加以下代码: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Socket.io Chat Room</title> </head> <body> <h1>Socket.io Chat Room</h1> <div id="messages"></div> <form id="message-form"> <input type="text" id="input-message" placeholder="Type your message here..."> <button type="submit">Send</button> </form> <script src="https://cdn.socket.io/socket.io-3.0.1.min.js"></script> <script src="client.js"></script> </body> </html> ``` 11. 在“client”文件夹中创建一个新的JavaScript文件,例如“client.js” 12. 在“client.js”中添加以下代码: ``` const socket = io('http://localhost:3000'); const messageForm = document.getElementById('message-form'); const inputMessage = document.getElementById('input-message'); const messages = document.getElementById('messages'); messageForm.addEventListener('submit', (event) => { event.preventDefault(); const message = inputMessage.value; if (message) { socket.emit('chat message', message); inputMessage.value = ''; } }); socket.on('chat message', (message) => { const li = document.createElement('li'); li.textContent = message; messages.appendChild(li); }); ``` 13. 在命令行中进入“client”文件夹并运行以下命令: ``` npm install express ``` 14. 在“client”文件夹中创建一个新的JavaScript文件,例如“server.js” 15. 在“server.js”中添加以下代码: ``` const express = require('express'); const app = express(); app.use(express.static('public')); app.listen(8080, () => { console.log('Server running on http://localhost:8080'); }); ``` 16. 在命令行中进入“client”文件夹并运行以下命令: ``` node server.js ``` 现在你就可以在浏览器中打开“http://localhost:8080”并开始聊天了。 要实现私聊和创建群聊的功能,你需要在服务器端和客户端中添加一些额外的代码。 对于私聊功能,你可以创建一个“私聊房间”,只有被邀请的用户才能加入该房间,并在该房间中进行私人对话。以下是一些可能有用的代码: 1. 服务器端: ``` const users = {}; io.on('connection', (socket) => { console.log('a user connected'); socket.on('login', (username) => { users[username] = socket.id; console.log(`${username} logged in`); }); socket.on('invite', (username) => { const roomId = `${socket.id}:${users[username]}`; socket.join(roomId); io.to(users[username]).emit('invited', roomId); }); socket.on('chat message', (data) => { const { message, roomId } = data; io.to(roomId).emit('chat message', message); }); socket.on('disconnect', () => { console.log('user disconnected'); }); }); ``` 2. 客户端: ``` const socket = io('http://localhost:3000'); const username = prompt('What is your name?'); socket.emit('login', username); let roomId = null; const inviteForm = document.getElementById('invite-form'); const inviteInput = document.getElementById('invite-input'); inviteForm.addEventListener('submit', (event) => { event.preventDefault(); const username = inviteInput.value; if (username) { socket.emit('invite', username); inviteInput.value = ''; } }); socket.on('invited', (id) => { roomId = id; messages.innerHTML = ''; messageForm.style.display = 'block'; }); messageForm.addEventListener('submit', (event) => { event.preventDefault(); const message = inputMessage.value; if (message) { socket.emit('chat message', { message, roomId }); inputMessage.value = ''; } }); socket.on('chat message', (message) => { const li = document.createElement('li'); li.textContent = message; messages.appendChild(li); }); ``` 对于创建群聊功能,你可以创建一个“群聊房间”,所有用户都可以加入该房间,并在该房间中进行群聊。以下是一些可能有用的代码: 1. 服务器端: ``` const rooms = {}; io.on('connection', (socket) => { console.log('a user connected'); socket.on('create room', () => { const roomId = socket.id; socket.join(roomId); rooms[roomId] = { name: `Room ${Object.keys(rooms).length + 1}` }; io.to(roomId).emit('room created', roomId); console.log(`Room ${roomId} created`); }); socket.on('join room', (roomId) => { socket.join(roomId); io.to(roomId).emit('user joined', { username: 'anonymous', message: 'joined the chat' }); console.log(`User ${socket.id} joined room ${roomId}`); }); socket.on('chat message', (data) => { const { message, roomId } = data; io.to(roomId).emit('chat message', message); }); socket.on('disconnect', () => { console.log('user disconnected'); }); }); ``` 2. 客户端: ``` const socket = io('http://localhost:3000'); const createRoomButton = document.getElementById('create-room-button'); const joinRoomForm = document.getElementById('join-room-form'); const joinRoomInput = document.getElementById('join-room-input'); createRoomButton.addEventListener('click', () => { socket.emit('create room'); }); joinRoomForm.addEventListener('submit', (event) => { event.preventDefault(); const roomId = joinRoomInput.value; if (roomId) { socket.emit('join room', roomId); joinRoomInput.value = ''; messages.innerHTML = ''; messageForm.style.display = 'block'; } }); socket.on('room created', (roomId) => { const option = document.createElement('option'); option.value = roomId; option.textContent = `Room ${Object.keys(rooms).length}`; selectRoom.appendChild(option); }); socket.on('user joined', (data) => { const { username, message } = data; const li = document.createElement('li'); li.textContent = `${username} ${message}`; messages.appendChild(li); }); socket.on('chat message', (message) => { const li = document.createElement('li'); li.textContent = message; messages.appendChild(li); }); ``` 以上代码只是一个简单的示例,你可以根据自己的需求进行更改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值