使用Nodejs和socket.io创建一个实时的聊天应用

在Youtube上看到了一个视频Build a Real Time Chat App With Node.js And Socket.io,作者的giithub地址为:https://github.com/WebDevSimplified,他的CodeOpen地址是:https://codepen.io/WebDevSimplified

Build a Real Time Chat App With Node.js And Socket.io

相关代码我已经上传到github-ChatRoomAppgitee-ChatApp,你可以直接使用git克隆下载源代码

git clone https://github.com/ccf19881030/ChatRoomApp.git

git clone https://gitee.com/havealex/ChatApp.git

项目前期准备

找一个趁手的前端开发工具,我使用的是VSCode,并且安装好Nodejs和npm、cnpm等。安装好开发环境和Nodejs,配置好nodejs的npm等环境变量后,创建一个ChatRoomApp文件夹,使用VSCode打开这个文件夹,打开终端在该文件夹所在目录下使用npm或cnpm安装socket.io和nodemon依赖

cnpm install socket.io
cnpm install --save-dev nodemon

创建index.html文件

如下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width,initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Chat App</title>
 <script defer src="http://localhost:3000/socket.io/socket.io.js"></script>
 <script defer src="client.js"></script>
 <style lang="less">
   body {
     padding: 0;
     margin: 0;
     display: flex;
     justify-content: center;
   }

   #message-container {
     width: 80%;
     max-width: 1200px;
   }

    #message-container div { 
     background-color: #CCC;
     padding: 5px;
    }

     #message-container div:nth-child(2n) { 
     background-color: #FFF;
    }
 </style>
</head>
<body>
 <div id="message-container"></div>
 <form id="send-container">
   <input type="text" id="message-input">
   <button type="submit" id="send-button">Send</button>
 </form>
</body>
</html>

在VSCode的项目中运行如下命令:

npm init

按照提示输出相应的项目配置信息,会在当前目录下生成一个package.json的项目配置文件,如下所示:

{
  "name": "chatroomapp",
  "version": "1.0.0",
  "description": "Build a Real Time Chat App With Node.js And Socket.io",
  "main": "server.js",
  "scripts": {
    "devStart": "nodemon server.js"
  },
  "keywords": [
    "Nodejs",
    "and",
    "Socket.io"
  ],
  "author": "ccf19818030",
  "license": "ISC",
  "dependencies": {
    "socket.io": "^2.3.0"
  },
  "devDependencies": {
    "nodemon": "^2.0.3"
  }
}

主要改变的是:

"scripts": {
    "devStart": "nodemon server.js"
  },

这条命令,将运行命令改成使用nodemon server.js,运行服务端代码server.js,之所以使用nodemon主要是因为它相比较node命令来说可以进行服务端代码的热更新。

server.js

const io = require('socket.io')(3000)
const usersList = {}

io.on('connection', socket => {
  socket.on('new-user', userName => {
    usersList[socket.id] = userName
    socket.broadcast.emit('user-connected', userName)
  })
  socket.on('send-chat-message', message => {
    socket.broadcast.emit('chat-message', { message: message, 
        userName: usersList[socket.id]} )
  })
  socket.on('disconnect', () => {
    socket.broadcast.emit('user-disconnected', usersList[socket.id])
    delete usersList[socket.id]
  })
})

client.js

const socket = io('http://localhost:3000')
const messageContainer = document.getElementById('message-container')
const messageForm = document.getElementById('send-container')
const messageInput = document.getElementById('message-input')

const userName = prompt('What is your name?')
appendMessage('You joined')
socket.emit('new-user', userName)

socket.on('chat-message', data => {
  appendMessage(`${data.userName}: ${data.message}`)
})

socket.on('user-connected', userName => {
  // console.log(data)
  appendMessage(`${userName} connected`)
})

socket.on('user-disconnected', userName => {
  // console.log(data)
  appendMessage(`${userName} disconnected`)
})

messageForm.addEventListener('submit', e => {
  e.preventDefault()
  const message = messageInput.value
  appendMessage(`You: ${message}`)
  socket.emit('send-chat-message', message)
  messageInput.value = ''
})

function appendMessage(message) {
  const messageElement = document.createElement('div')
  messageElement.innerText = message
  messageContainer.append(messageElement)
}

运行程序

目录结构如下图所示:
项目目录结构

运行服务端后台代码

写完代码后在VSCode中首先执行nodemon server.js运行服务器后端,如下图所示:
server.js

运行前端代码

使用Google或者360极速浏览器打开项目目录下的index.html文件,如下图所示:
360
Google
按照提示输入聊天的用户名,分别输入张三和李四,在浏览器中分别输出如下结果:

555
666
可以在右侧的输入框中输入消息,点击Send按钮对其他当前所有在线的Websocket客户端发送消息,如下图所示:
777
888

猜你喜欢

转载自blog.csdn.net/ccf19881030/article/details/105696860
今日推荐