基于JavaScript构建实时聊天室

1. 前言

随着互联网的发展,人们之间的信息交流在不断的创新和演化,聊天室也成为了一种常见的社交方式。而现在,我们将使用JavaScript构建一个实时的聊天室。

2. 开始

2.1 需求分析

首先,我们需要确定聊天室的功能需求。我们需要实现以下功能:

用户能够登陆聊天室

用户能够发送消息到聊天室

用户能够查看聊天室中的所有消息

聊天室中的所有用户都能够实时接收到新消息

用户能够退出聊天室

根据以上需求,我们可以确定我们需要使用WebSocket作为聊天室的通信协议。

2.2 创建服务端

我们使用Node.js来创建服务端。首先我们需要安装WebSocket模块:

npm i websocket

然后创建一个服务器文件 server.js:

const WebSocketServer = require("websocket").server;

const http = require("http");

//创建一个 http server

const httpServer = http.createServer((req, res) => {

res.end();

});

//将服务挂载到80端口上

httpServer.listen(80, () => {

console.log("server is listening on 80 port");

});

//创建 webSocket server

const wsServer = new WebSocketServer({

httpServer,

});

//记录所有的连接

const clients = [];

wsServer.on("request", (request) => {

//连接成功

const connection = request.accept(null, request.origin);

clients.push(connection);

//监听消息

connection.on("message", (message) => {

//广播消息到所有连接

clients.forEach((client) => {

if (client !== connection && client.readyState === WebSocket.OPEN) {

client.send(message.utf8Data);

}

});

});

//关闭连接

connection.on("close", (reasonCode, description) => {

//从clients数组中移除该连接

const index = clients.indexOf(connection);

if (index >= 0) {

clients.splice(index, 1);

}

});

});

代码解释:

使用Node.js中的http模块创建一个http服务,并将服务挂在到80端口。

WebSocketServer是WebSocket提供的对协议的实现,它需要一个HTTP server serv一个依赖关系来工作。在参数 httpServer 中传递http服务,这样,WebSocket将通过HTTP服务来接收它的握手。

创建一个clients数组,用于保存聊天室中所有连接。

当有新连接时,将连接保存到clients中。

当收到新消息时,遍历clients数组,发送消息到其他连接中。

当连接关闭时,从clients数组中移除该连接。

2.3 创建客户端

我们使用HTML、CSS、JavaScript创建客户端。

首先,我们创建一个登录页面 index.html:

<!DOCTYPE html>

<html>

<head>

<link rel="stylesheet" href="./style.css" />

<title>登录</title>

</head>

<body>

<div class="login-container">

<h1>Login</h1>

<input id="nameInput" placeholder="Name" autofocus />

<button onclick="login()">Join</button>

</div>

<script src="./client.js"></script>

</body>

</html>

然后,我们创建一个样式文件 style.css:

body {

height: 100vh;

display: flex;

justify-content: center;

align-items: center;

}

.login-container {

width: 300px;

background-color: #f0f0f0;

padding: 20px;

border-radius: 5px;

display: flex;

flex-direction: column;

align-items: center;

}

h1 {

margin: 0 0 20px 0;

}

input {

margin: 0 0 10px 0;

padding: 10px;

border: none;

border-radius: 5px;

width: 100%;

font-size: 16px;

}

button {

padding: 10px;

border: none;

border-radius: 5px;

background-color: #0095ff;

color: #fff;

width: 100%;

font-size: 16px;

cursor: pointer;

}

最后,我们创建一个客户端文件 client.js:

let websocket = null;

let name = "";

function login() {

const nameInput = document.getElementById("nameInput");

//获取用户名

name = nameInput.value.trim();

if (name) {

//创建WebSocket连接

websocket = new WebSocket("ws://localhost:80");

//监听连接打开事件

websocket.onopen = (evt) => {

console.log("Connection open ...");

//发送欢迎消息

websocket.send(

JSON.stringify({

type: "welcome",

name,

})

);

};

//监听消息事件

websocket.onmessage = (evt) => {

const message = JSON.parse(evt.data);

switch (message.type) {

case "welcome":

return;

case "message":

addMessage(message);

return;

}

};

//监听连接关闭事件

websocket.onclose = (evt) => {

console.log("Connection closed.");

};

}

}

function addMessage(message) {

const chat = document.getElementById("chat");

const div = document.createElement("div");

const name = document.createElement("span");

const text = document.createElement("span");

name.innerText = message.name;

name.style.color = message.color;

text.innerText = message.text;

div.appendChild(name);

div.appendChild(text);

chat.appendChild(div);

}

function sendMessage() {

const input = document.getElementById("messageInput");

const message = {

type: "message",

name,

color: "#000",

text: input.value.trim(),

};

if (message.text) {

//发送消息

websocket.send(JSON.stringify(message));

//清空输入框

input.value = "";

}

}

代码解释:

创建websocket和name变量,用于保存WebSocket连接和用户名。

登录函数,当用户填写用户名后,创建和服务器的WebSocket连接,并发送一条欢迎消息。

添加消息函数,将接收到的消息添加到聊天室中。

发送消息函数,获取用户输入的消息,并向服务器发送一条消息。

2.4 测试

启动服务端:

node server.js

在浏览器中打开 index.html 文件,填写用户名并加入聊天室。我们可以向聊天室发送消息,并实时接收到其他用户发送的消息。

3. 总结

通过本文,我们了解了使用WebSocket构建实时聊天室的基本步骤。在开发实际项目中,我们可以根据业务需求对聊天室的功能进行扩展。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。