玩转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中return false(阻止)的用法
Aug 14 Javascript
JS获取地址栏参数的小例子
Aug 23 Javascript
javascritp添加url参数将参数加入到url中
Sep 25 Javascript
Javascript中的包装类型介绍
Apr 02 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
Jul 27 Javascript
利用js定义一个导航条菜单
Mar 14 Javascript
Angular使用$http.jsonp发送跨站请求的方法
Mar 16 Javascript
使用express搭建一个简单的查询服务器的方法
Feb 09 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
Apr 09 Javascript
微信小程序激励式视频广告组件使用详解
Dec 06 Javascript
小程序中设置缓存过期的实现方法
Jan 14 Javascript
原生JS实现pc端轮播图效果
Dec 21 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高自定义性安全验证码代码
2011/11/27 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
js 发个判断字符串是否为符合标准的函数
2009/04/27 Javascript
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
vuex state中的数组变化监听实例
2019/11/06 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python文件夹与文件的相关操作(推荐)
2016/07/25 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
python pygame实现五子棋小游戏
2020/10/26 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
耐克中国官方商城:Nike中国
2018/10/18 全球购物
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
单位在职证明范本
2014/01/09 职场文书
最新个人职业生涯规划书
2014/01/22 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
公证书样本
2014/04/10 职场文书
国旗下的演讲稿
2014/05/08 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
Python机器学习之基础概述
2021/05/19 Python
Python实现拼音转换
2021/06/07 Python