玩轉(zhuǎn)NODE.JS(四)-搭建簡單的聊天室的代碼
Nodejs好久沒有跟進了,最近想用它搞一個聊天室,然后便偶遇了socket.io這個東東,說是可以用它來簡單的實現(xiàn)實時雙向的基于事件的通訊機制。我便看了一些個教程使用它來搭建一個超級簡單的聊天室。
初始化項目
在電腦里新建一個文件夾,叫做“chatroom”,然后使用npm進行初始化:
$ npm init
然后根據(jù)提示以及相關(guān)信息一步一步輸入,當(dāng)然也可以一路回車下去,之后會在項目里生成一個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",
}
這個文件描述了項目的相關(guān)信息。
安裝socket.io
接下來,安裝socket.io:
$ npm install socket.io --save
安裝Socket.IO的時候,--save參數(shù)用于保存模塊依賴信息到package.json文件,安裝完后,打開package.json文件會看到里面多了一項內(nèi)容:
"dependencies": {
"socket.io": "^1.2.1"
}
同時Socket.IO安裝在了node_modules文件夾下。
實現(xiàn)聊天-服務(wù)器端
首先我們來編寫服務(wù)器端程序,新建文件“index.js”,在里面導(dǎo)入如下模塊:
var http = require('http');
var socketio = require('socket.io');
var fs = require('fs');
第一行是導(dǎo)入http模塊,先前我們已經(jīng)見過了,用于創(chuàng)建http server。
第二行是導(dǎo)入socket.io模塊,實現(xiàn)實時聊天必備的,不再贅述。
第三行是導(dǎo)入fs模塊,用于讀取文件。具體的一會你就會了解到。
通過http模塊創(chuàng)建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行是返回請求的狀態(tài)碼,第9行是返回讀取到的內(nèi)容給瀏覽器。然后這個http server使用listen方法監(jiān)聽8888端口。
接下來,就是使用socket.io來實現(xiàn)聊天的事件了。在剛剛的index.js文件的http server下面接著創(chuàng)建socket.io對象。
var io = socketio(app);
然后監(jiān)聽connection事件,當(dāng)瀏覽器連接到此Socket.IO服務(wù)時觸發(fā)該事件:
io.on('connection', function (socket) {
// 監(jiān)聽瀏覽器端的chat事件
socket.on('chat', function (data) {
console.log(data);
io.emit('sendmsg', data);
});
});
第4行用于將信息輸入到后臺的顯示器,第5行用于將內(nèi)容發(fā)送給客戶端,為了知道服務(wù)器是否啟動,我在后面又加了如下一句:
console.log("Server is running at http://localhost:8888")
至此,服務(wù)器端編碼完成。
實現(xiàn)聊天-客戶端
首先實現(xiàn)界面部分,僅僅有顯示消息記錄以及消息發(fā)送框,代碼如下:
<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>
<!-- 消息發(fā)送框 -->
<div id="form">
<input id="m" autocomplete="off" /><button id="send">Send</button>
</div>
</body>
</html>
然后需要在里面加上JS來實現(xiàn)與服務(wù)器端的通信,將服務(wù)器端獲取的數(shù)據(jù)展示到客戶端,主要代碼如下:
<script>
// 連接到Socket.IO服務(wù)器
var socket = io.connect();
$(function() {
// 綁定發(fā)按鈕發(fā)送消息的事件
$('#send').on('click', function() {
var data = $('#m').val();
// 創(chuàng)建chat事件并發(fā)送消息給服務(wù)器
// emit('event') 表示發(fā)送了一個event命令
// 使用io.on('event')接收對應(yīng)事件的信息
// 所以客戶端服務(wù)器端需要使用socket.on('chat')接收聊天信息
socket.emit('chat', { msg: data });
$('#m').val('');
});
});
$(function() {
// 接收消息并顯示到消息記錄框中
socket.on('sendmsg', function(msg) {
$('#messages').append($('<li>').text(msg.msg));
});
});
</script>
此時,可以執(zhí)行:
$ node index.js
然后在瀏覽器打開localhost:8888查看效果。
至此,一個簡陋的聊天室就實現(xiàn)了,有興趣的朋友可以在此基礎(chǔ)上進行擴展,實現(xiàn)功能更為復(fù)雜的聊天室。
項目源代碼:源碼下載
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Node.js基礎(chǔ)入門之緩存區(qū)與文件操作詳解
Node.js是一個基于Chrome?V8引擎的JavaScript運行時。類似于Java中的JRE,.Net中的CLR。本文將詳細為大家介紹Node.js中的緩存區(qū)與文件操作,感興趣的可以了解一下2022-03-03
在Mac OS上安裝使用Node.js的項目自動化構(gòu)建工具Gulp
Gulp是一個在使用上比Grunt更加簡潔的自動化工具(文中附有對比),和Node的npm包管理器配合使用非常方便,下面就記錄一下在Mac OS上安裝使用Node.js的項目自動化構(gòu)建工具Gulp的方法:2016-06-06
詳解Node.js利用node-git-server快速搭建git服務(wù)器
本篇文章主要介紹了詳解Node.js利用node-git-server快速搭建git服務(wù)器,非常具有實用價值,需要的朋友可以參考下2017-09-09
基于Express和Multer實現(xiàn)文件本地服務(wù)器文件上傳功能
在現(xiàn)代應(yīng)用程序中,文件上傳功能成為了用戶共享和存儲數(shù)據(jù)的重要途徑,所以本文我們一起來探討文件上傳中間件的重要性,并提供常見的實現(xiàn)方法和相應(yīng)的代碼吧2023-06-06
淺析node應(yīng)用的timing-attack安全漏洞
本篇文章給大家通過原理的原因分析了node應(yīng)用的timing-attack安全漏洞問題,有興趣的朋友閱讀參考下。2018-02-02
Node.js中MongoDB插入數(shù)據(jù)的實現(xiàn)方法
在Node.js中,可以使用MongoDB原生驅(qū)動或Mongoose庫來連接和操作MongoDB數(shù)據(jù)庫,本文就來介紹一下Node.js中MongoDB插入數(shù)據(jù)的實現(xiàn)方法,感興趣的可以了解一下2023-12-12

