玩转NODE.JS(四)-搭建简单的聊天室的代码


Posted in Javascript onNovember 11, 2016

Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制。我便看了一些个教程使用它来搭建一个超级简单的聊天室。

初始化项目

在电脑里新建一个文件夹,叫做“chatroom”,然后使用npm进行初始化:

$ npm init

然后根据提示以及相关信息一步一步输入,当然也可以一路回车下去,之后会在项目里生成一个package.json文件,里面的信息如下:

$ cat package.json
{
 "name": "chatroom",
 "version": "1.0.0",
 "description": "a room which lets people chat",
 "main": "index.js",
 "scripts": {
  "test": "nothing"
 },
 "author": "voidy",
 "license": "ISC",
 }

这个文件描述了项目的相关信息。

安装socket.io

接下来,安装socket.io:

$ npm install socket.io --save

安装Socket.IO的时候,--save参数用于保存模块依赖信息到package.json文件,安装完后,打开package.json文件会看到里面多了一项内容:

"dependencies": {
   "socket.io": "^1.2.1"
 }

同时Socket.IO安装在了node_modules文件夹下。

实现聊天-服务器端

首先我们来编写服务器端程序,新建文件“index.js”,在里面导入如下模块:

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

第一行是导入http模块,先前我们已经见过了,用于创建http server。

第二行是导入socket.io模块,实现实时聊天必备的,不再赘述。

第三行是导入fs模块,用于读取文件。具体的一会你就会了解到。

通过http模块创建app,在刚刚的代码中加入如下语句:

var app = http.createServer(function(req, res) {
 
  fs.readFile(__dirname + '/index.html', function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }
    res.writeHead(200); 
    res.write(data);  
    res.end();
  });
}).listen(8888);

fs.readFile()方法用于读取文件,在这里读取的是index.html文件,也就是一会即将要编写的前端聊天室的展示页面。

第8行是返回请求的状态码,第9行是返回读取到的内容给浏览器。然后这个http server使用listen方法监听8888端口。

接下来,就是使用socket.io来实现聊天的事件了。在刚刚的index.js文件的http server下面接着创建socket.io对象。

var io = socketio(app);

然后监听connection事件,当浏览器连接到此Socket.IO服务时触发该事件:

io.on('connection', function (socket) {
  // 监听浏览器端的chat事件
  socket.on('chat', function (data) {
    console.log(data);
    io.emit('sendmsg', data); 
  });
});

第4行用于将信息输入到后台的显示器,第5行用于将内容发送给客户端,为了知道服务器是否启动,我在后面又加了如下一句:

console.log("Server is running at http://localhost:8888")

至此,服务器端编码完成。

实现聊天-客户端

首先实现界面部分,仅仅有显示消息记录以及消息发送框,代码如下:

<html>
  <head>
    <meta charset="utf-8">
    <title>Socket.IO chat</title>
    <style>
      * { margin: 0; padding: 0; box-sizing: border-box; }
      body { font: 13px Helvetica, Arial; }
      #form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
      #form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
      #form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages li { padding: 5px 10px; }
      #messages li:nth-child(odd) { background: #eee; }
    </style>
    <!-- 引入socket.io库和jQuery库 -->
    <script src="https://cdn.socket.io/socket.io-1.2.1.js"></script>
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
  </head>
  <body>
    <!-- 显示消息记录 -->
    <ul id="messages"></ul>

    <!-- 消息发送框 -->
    <div id="form">
      <input id="m" autocomplete="off" /><button id="send">Send</button>
    </div>
  </body>
</html>

然后需要在里面加上JS来实现与服务器端的通信,将服务器端获取的数据展示到客户端,主要代码如下:

<script>
// 连接到Socket.IO服务器
var socket = io.connect();

$(function() {
 // 绑定发按钮发送消息的事件
  $('#send').on('click', function() {
    var data = $('#m').val();
   // 创建chat事件并发送消息给服务器
    // emit('event') 表示发送了一个event命令
    // 使用io.on('event')接收对应事件的信息
    // 所以客户端服务器端需要使用socket.on('chat')接收聊天信息
    socket.emit('chat', { msg: data });
    $('#m').val('');
  });
});

$(function() {
  // 接收消息并显示到消息记录框中
  socket.on('sendmsg', function(msg) {
    $('#messages').append($('<li>').text(msg.msg));
  });
});
</script>

此时,可以执行:

$ node index.js

然后在浏览器打开localhost:8888查看效果。

至此,一个简陋的聊天室就实现了,有兴趣的朋友可以在此基础上进行扩展,实现功能更为复杂的聊天室。

项目源代码:源码下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS获取农历日期具体实例
Nov 14 Javascript
纯js写的分页表格数据为json串
Feb 18 Javascript
js实现简单锁屏功能实例
May 27 Javascript
jquery+ajax请求且带返回值的代码
Aug 12 Javascript
jQuery实现下滑菜单导航效果代码
Aug 25 Javascript
js实现可折叠展开的手风琴菜单效果
Sep 07 Javascript
浅析JavaScript中命名空间namespace模式
Jun 22 Javascript
打造自己的jQuery插件入门教程
Sep 23 Javascript
浅谈jquery拼接字符串效率比较高的方法
Feb 22 Javascript
通过实例解析js简易模块加载器
Jun 17 Javascript
Vue中图片Src使用变量的方法
Oct 30 Javascript
js制作提示框插件
Dec 24 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
Nov 11 #Javascript
JSON与XML的区别对比及案例应用
Nov 11 #Javascript
浅谈AngularJS中ng-class的使用方法
Nov 11 #Javascript
JS中数组重排序方法
Nov 11 #Javascript
js编写的treeview使用方法
Nov 11 #Javascript
Vue.js教程之计算属性
Nov 11 #Javascript
JS控制TreeView的结点选择
Nov 11 #Javascript
You might like
PHP与SQL注入攻击防范小技巧
2011/09/16 PHP
php使用异或实现的加密解密实例
2013/09/04 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
2017/08/03 PHP
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
JQuery实现级联下拉框效果实例讲解
2015/09/17 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
基于JavaScript实现抽奖系统
2018/01/16 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
2018/04/05 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
Vue中添加滚动事件设置的方法详解
2020/09/14 Javascript
Python获取系统默认字符编码的方法
2015/06/04 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
nohup的用法
2014/08/10 面试题
排查整治工作方案
2014/06/09 职场文书
校长个人总结
2015/03/03 职场文书
党员干部公开承诺书范文
2015/04/27 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
歌咏比赛主持词
2015/06/29 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
python引入其他文件夹下的py文件具体方法
2021/05/23 Python
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android