通过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)的更多相关文章

  1. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...

  2. node.js+websocket实现简易聊天室

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...

  3. 利用socket.io实现多人聊天室(基于Nodejs)

    socket.io简单介绍 在Html5中存在着这种一个新特性.引入了websocket,关于websocket的内部实现原理能够看这篇文章.这篇文章讲述了websocket无到有,依据协议,分析数据 ...

  4. Spring整合DWR comet 实现无刷新 多人聊天室

    用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种.通常我们要实现无刷新,一般会使用到Ajax.Ajax 应用程序可以使用两种基本的方法解决这一问题:一种方法是浏览器每隔 ...

  5. Asp.net MVC + Signalr 实现多人聊天室

    Asp.net SignalR 简介: 首先简单介绍一下Signalr ,我也是刚接触,觉得挺好玩的,然后写了一个多人聊天室. Asp.net SignalR 是为Asp.net 开发人员提供的一个库 ...

  6. Apache MiNa 实现多人聊天室

    Apache MiNa 实现多人聊天室 开发环境: System:Windows JavaSDK:1.6 IDE:eclipse.MyEclipse 6.6 开发依赖库: Jdk1.4+.mina-c ...

  7. 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室

    原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  8. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  9. 多人聊天室(Java)

    第1部分 TCP和UDP TCP:是一种可靠地传输协议,是把消息按一个个小包传递并确认消息接收成功和正确才发送下一个包,速度相对于UDP慢,但是信息准确安全:常用于一般不要求速度和需要准确发送消息的场 ...

随机推荐

  1. python面试的100题(17)

    内存管理与垃圾回收机制 48.哪些操作会导致Python内存溢出,怎么处理? 内存溢出:你申请了10个字节的内存,但写入了大于10个字节的数据会导致内存溢出 内存溢出原因:1.内存中加载的数据量过于庞 ...

  2. ASP.NET MVC 获取表单数据

    public class Person { public string Name{get;set;} public string Phone{get;set;} } view层 @model Mode ...

  3. 插件与App的跳转,及路由的关系

    在SDK中 无法直接跳App 的界面,这个时候需要使用 路由,或者通过 NSClassFromString 的 presentViewController 来跳转. 直接贴代码: UIViewCont ...

  4. python3 yield实现假的多并发

    import time def fun1(): while True: print("fun1") time.sleep(0.1) yield def fun2(): while ...

  5. HTTP响应头 状态码

    HTTP 简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传 ...

  6. JS高级---总结继承

    总结继承 面向对象特性: 封装, 继承,多态 继承, 类与类之间的关系, 面向对象的语言的继承是为了多态服务的   js不是面向对象的语言, 但是可以模拟面向对象,模拟继承,为了节省内存   继承: ...

  7. IntelliJ IDEA 2017.3百度-----树状结构

    ------------恢复内容开始------------ ------------恢复内容结束------------

  8. 圆桌问题 (ArrayList+模拟)

    圆桌上围坐着2n个人.其中n个人是好人,另外n个人是坏人.如果从第一个人开始数数,数到第m个人,则立即处死该人:然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人 ...

  9. 这是一篇通过open live writer发布的博文

    这两天零零总总的尝试了两三款写博客的软件,总感觉不怎么上手,最后还是使用博客园官方推荐的工具写博吧,简单方便,目前的功能基本都有,尤其是粘贴图片特别方便,回想之前的几篇博文,真是一种煎熬哈哈(对于我这 ...

  10. 数位dp(Balanced Numbers )

    题意:一个数,如果满足奇数的数字出现偶数次,偶数的数字出现奇数次, 就是符合的数,注比如:12313  就满足,因为1 3出现了偶数次.2出现了奇数次 思路,对于这道题,就是状态压缩加dp: 对于一个 ...