玩转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 相关文章推荐
初学Javascript的一些总结
Nov 03 Javascript
50款非常棒的 jQuery 插件分享
Mar 29 Javascript
js动态添加事件并可传参数示例代码
Oct 21 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
May 14 Javascript
js获取滚动距离的方法
May 30 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
Sep 28 Javascript
基于Vue的延迟加载插件vue-view-lazy
May 21 Javascript
在Vue中使用icon 字体图标的方法
Jun 14 Javascript
详解nuxt 微信公众号支付遇到的问题与解决
Aug 26 Javascript
JavaScript实现表单验证功能
Dec 09 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
Jan 25 Javascript
vue+iview实现手机号分段输入框
Mar 25 Vue.js
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
js常用函数 不错
2006/09/08 Javascript
JavaScript中的Document文档对象
2008/01/16 Javascript
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
某人初学javascript的时候写的学习笔记
2010/12/30 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
微信小程序抽奖组件的使用步骤
2021/01/11 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
python正则表达式修复网站文章字体不统一的解决方法
2013/02/21 Python
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
python实现朴素贝叶斯算法
2018/11/19 Python
python 进程池pool使用详解
2020/10/15 Python
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
Linux常见面试题
2016/10/04 面试题
自我鉴定书范文
2013/10/02 职场文书
个人评语大全
2014/05/04 职场文书
英语求职信范文
2014/05/23 职场文书
安全生产宣传标语
2014/06/06 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
实习报告怎么写
2019/06/20 职场文书