玩转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 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
Dec 28 Javascript
jquery利用event.which方法获取键盘输入值的代码
Oct 09 Javascript
JavaScript的内存释放问题详解
Jan 21 Javascript
Javascript将JSON日期格式化
Aug 23 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
Nov 09 Javascript
详解vue跨组件通信的几种方法
Jun 15 Javascript
JavaScript与Java正则表达式写法的区别介绍
Aug 15 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
Apr 18 Javascript
node.js之基础加密算法模块crypto详解
Sep 11 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
Jun 05 Javascript
JavaScript 中判断变量是否为数字的示例代码
Oct 22 Javascript
Vue实现图书管理案例
Jan 20 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
php的一个简单加密解密代码
2014/01/14 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
2011/08/23 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
js 实现在2d平面上画8的方法
2018/10/10 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
python中的随机函数小结
2018/01/27 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
Python登录系统界面实现详解
2019/06/25 Python
Python如何转换字符串大小写
2020/06/04 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
Python实现画图软件功能方法详解
2020/07/28 Python
详解Canvas事件绑定
2018/06/27 HTML / CSS
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
药学专业大专生的自我评价
2013/12/12 职场文书
医学生职业生涯规划书范文
2014/03/13 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
社会公德演讲稿
2014/05/20 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
2015年教学工作总结
2015/04/02 职场文书
申请吧主发表的感言
2015/08/03 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle
Python合并多张图片成PDF
2021/06/09 Python