使用node.js实现多人聊天室(socket.io、B/S)
通过B/S架构实现多人聊天,客户端连接服务器,发送信息,服务器接收信息之后返回给客户端。
主要是通过socket.io实现浏览器和服务器之间进行实时,双向和基于事件的通信。
socket.io官方文档:https://socket.io/docs/
新建一个文件夹作为项目文件夹
新建一个
js文件作为服务器,新建一个HTML文件作为客户端。建立服务器,使用
http模块的createSrever快速创建一个服务,监听端口为3000;
let http = require("http");
let server = http.createServer((req, res) => {
res.end("<h1>server starting!</h1>")
});
server.listen(3000, () => {
console.log("listening on *:3000");
});
在项目根目录打开终端运服务器,提示端口服务器已经在3000端口开启。

在浏览器中打开本地3000端口地址

在项目文件夹根目录终端使用
npm下载安装socket.io模块
npm i socket.io
下载好后引用模块
let ws = require("socket.io");
let io = ws(server);
监听客户端连接服务器情况,进行收发信息处理
io.on('connection', client => {
let socketId = client.id; // 获取客户端的ID
let clientIp = client.request.connection.remoteAddress; // 获取客户端的地址
let address = client.handshake.address; // 获取客户端的地址
console.log(address + " connected");
// 监听客户端发送的信息
client.on('message', msg => {
console.log(address + ": " + msg);
// 向所有客户端发送信息
io.emit("message", msg);
})
})
建立客户端
服务器返回一个网页,用于客户端输入发送信息
<div class="chat-box" id="chatbox">
<input type="" name="" id="message" placeholder="Send STH...">
</div>
引入socket.io
<script src="/socket.io/socket.io.js"></script>
绑定回车事件,按回车发送信息,并显示在网页中
<script>
let message = document.getElementById("message");
let client = io.connect("/"); // 连接服务器
document.onkeydown = function(event) { // 绑定键盘按键事件
var e = event || window.event || arguments.callee.caller.arguments[0];
if(e&&e.keyCode === 13) { // Enter键的代码是13
let val = message.value;
if(!val) return;
client.send(val); // 向服务器发送输入框内容
message.value = ""; // 清空输入框
}
}
// 监听服务器发送的消息,将接收到的消息显示在网页上
client.on("message", data => {
let p = document.createElement('p');
p.innerHTML = data;
document.body.appendChild(p);
})
</script>
回到服务器
引入
fs模块,将页面作为响应返回前端
let server = http.createServer((req, res) => {
let html = fs.readFileSync("./index.html");
res.end(html)
});
启动服务器,在浏览器中访问


显示一个用户已经连接

测试

附录
server.js
let http = require("http");
let ws = require("socket.io");
let fs = require("fs");
let server = http.createServer((req, res) => {
let html = fs.readFileSync("./index.html");
res.end(html);
});
let io = ws(server);
io.on('connection', client => {
let socketId = client.id; // 获取客户端的ID
let clientIp = client.request.connection.remoteAddress; // 获取客户端的地址
let address = client.handshake.address; // 获取客户端的地址
console.log(address + " connected");
client.on('message', msg => {
console.log(address + ": " + msg);
io.emit("message", msg);
})
})
server.listen(3000, () => {
console.log("listening on *:3000");
});
index.html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div class="chat-box" id="chatbox">
<input type="" name="" id="message" placeholder="Send STH...">
</div> <script src="/socket.io/socket.io.js"></script>
<script>
let message = document.getElementById("message");
let client = io.connect("/"); document.onkeydown = function(event) {
var e = event || window.event || arguments.callee.caller.arguments[0]; if(e&&e.keyCode === 13) {
let val = message.value;
if(!val) return;
client.send(val); message.value = "";
}
} client.on("message", data => {
let p = document.createElement('p');
p.innerHTML = data;
document.body.appendChild(p);
}) </script>
</body>
</html>
使用node.js实现多人聊天室(socket.io、B/S)的更多相关文章
- 基于Node.js + WebSocket 的简易聊天室
代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...
- node.js+websocket实现简易聊天室
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...
- 利用socket.io实现多人聊天室(基于Nodejs)
socket.io简单介绍 在Html5中存在着这种一个新特性.引入了websocket,关于websocket的内部实现原理能够看这篇文章.这篇文章讲述了websocket无到有,依据协议,分析数据 ...
- Spring整合DWR comet 实现无刷新 多人聊天室
用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种.通常我们要实现无刷新,一般会使用到Ajax.Ajax 应用程序可以使用两种基本的方法解决这一问题:一种方法是浏览器每隔 ...
- Asp.net MVC + Signalr 实现多人聊天室
Asp.net SignalR 简介: 首先简单介绍一下Signalr ,我也是刚接触,觉得挺好玩的,然后写了一个多人聊天室. Asp.net SignalR 是为Asp.net 开发人员提供的一个库 ...
- Apache MiNa 实现多人聊天室
Apache MiNa 实现多人聊天室 开发环境: System:Windows JavaSDK:1.6 IDE:eclipse.MyEclipse 6.6 开发依赖库: Jdk1.4+.mina-c ...
- 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室
原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室
原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- 多人聊天室(Java)
第1部分 TCP和UDP TCP:是一种可靠地传输协议,是把消息按一个个小包传递并确认消息接收成功和正确才发送下一个包,速度相对于UDP慢,但是信息准确安全:常用于一般不要求速度和需要准确发送消息的场 ...
随机推荐
- c++踩坑大法好 typedef和模板
1,typedef字面意思,自定义一种数据类型 语法:typedef 类型名称 类型标识符; 基本用法: 1) 为基本数据类型定义新的类型名. 2) 为自定义数据类型(结构体.公用体和枚举类型)定义简 ...
- Docker+JMeter单机版+MinIO
基于JMeter5.1.1+MinIO JMeter发起压测 MinIO作为文件服务器 一.目录结构: Dockerfile文件: FROM ubuntu:18.04# 基础镜像 MAINTAINE ...
- Grafana展示zabbix监控数据
一.安装步骤 (1)进入官网选择合适的操作系统版本下载Grafana:https://grafana.com/grafana/download?platform=linux [root@zabbix- ...
- VS2017连接MySQL数据库
vs默认无法直接连接mysql,需要我们自己配置环境. 1.下载mysql-installer-community-8.0.18.0.msi 下载地址:https://dev.mysql.com/do ...
- 解决无法将“babel”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
错误截图: 第一反应想到的是环境变量没有配置好,再仔细检查一下,并没有错误 在cmd窗口运行命令“ babel --version ”,如果出现对应的版本号,那就说明环境变量是正确的 解决方案: 用管 ...
- java下载和环境变量配置
初学java,以前没有接触过这方面内容,所以简要记录一下我2个月的学习流程. 首先,我在慕课上学习java的基础,浙江大学翁恺老师的课程. 下载ECLIPSE-java 进入官网:https://ww ...
- 小议WebRTC拥塞控制算法:GCC介绍
网络拥塞是基于IP协议的数据报交换网络中常见的一种网络传输问题,它对网络传输的质量有严重的影响,网络拥塞是导致网络吞吐降低,网络丢包等的主要原因之一,这些问题使得上层应用无法有效的利用网络带宽获得高质 ...
- Docker 进入正在运行的容器的4种方式
在使用Docker创建了容器之后,如何进入该容器呢? 进入Docker容器比较常见的几种做法如下: 使用docker attach 使用SSH 使用nsenter 使用exec 一.使用docker ...
- awk从放弃到入门(1):awk基础
一.awk简介 awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK 的确拥有自己的语言: AWK ...
- python 变量的赋值【内存地址】
注意: python所有的数据都是对象,变量只是指向一个对象的地址,一旦将变量的值或者类型改变,变量指向的地址就有可能发生变化 这个特性在使用默认参数的时候一定要注意