玩转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 相关文章推荐
jQuery数组处理代码详解(含实例演示)
Feb 03 Javascript
简单常用的幻灯片播放实现代码
Sep 25 Javascript
JavaScript使用concat连接数组的方法
Apr 06 Javascript
分享jQuery网页元素拖拽插件
Dec 01 Javascript
原生js封装二级城市下拉列表的实现代码
Jun 16 Javascript
JS实现图片局部放大或缩小的方法
Aug 20 Javascript
JavaScript简单下拉菜单特效
Sep 13 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
May 31 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
May 22 Javascript
详解如何在Vue项目中发送jsonp请求
Oct 25 Javascript
详解Nuxt.js 实战集锦
Nov 19 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
Apr 27 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
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
php日历制作代码分享
2014/01/20 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
yii框架搜索分页modle写法
2016/12/19 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
Bootstrap表单布局
2016/07/19 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
Vue2 监听属性改变watch的实例代码
2018/08/27 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
python实现一个简单的ping工具方法
2019/01/31 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
接口的多继承会带来哪些问题
2015/08/17 面试题
物流专业大学生的自我鉴定
2013/11/13 职场文书
大学生旷课检讨书
2014/01/22 职场文书
成绩单公证书
2014/04/10 职场文书
学校德育工作总结2015
2015/05/11 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技