จากบทความนี้นะครับ
https://www.thaicreate.com/community/chat-nodejs-socketio.html
ผมเริ่มโดยการ Install Node js ดังนี้ครับ
ไปที่ dir ของ application
Code
cd /home/admin/web/my-domain.com/public_html
Download File
Code
wget https://nodejs.org/dist/v8.11.1/node-v8.11.1-linux-x64.tar.xz
Extract File
Code
tar xvf node-v8.11.1-linux-x64.tar.xz
เปลี่ยนชื่อโฟลเดอร์
Code
mv node-v8.11.1-linux-x64 nodejs
Install node และ npm
Code
mkdir ~/bin
cp nodejs/bin/node ~/bin
cd ~/bin
ln -s ../nodejs/lib/node_modules/npm/bin/npm-cli.js npm
ไม่มี error ระหว่างการติดตั้ง node js
ตรวจสอบ version ของ node และ npm
Code
$ node --version
$ npm --version
ได้ node version ===> v6.3.1 และ npm version ===> 3.10.3
กลับมาที่ dir หลัก
Code
cd
-----------------------------------------------
ทำการ Install express
ไปที่ dir ของ application
Code
cd /home/admin/web/my-domain.com/public_html
และทำการ install
Code
npm install express
ไม่มี error ระหว่างการติดตั้ง express
กลับมาที่ dir หลัก
Code
cd
-----------------------------------------------
ทำการ Install socket io
ไปที่ dir ของ application
Code
cd /home/admin/web/my-domain.com/public_html
และทำการ install
Code
npm install socket.io
ไม่มี error ระหว่างการติดตั้ง socket io
-----------------------------------------------
ทำการสร้างไฟล์ application.js (ตามตัวอย่างในบทความ)
Code
var serv = require("socket.io"); // เรียกใช้ socket.io
var io = serv.listen(9999); // เปิดเซิฟเวอร์ที่ port 9999
console.log("server start"); // log ที่ command ว่า server start ปล. ให้ผลเหมือน System.out.println();
var name = {}; // เตียมตัวแปร name สำหรับเก็บชื่อผู้เข้าห้องแชต
io.sockets.on('connection', function(socket) { // เมื่อมีการ connect เข้ามา
var ipv4 = socket.request.socket.remoteAddress; // เก็บ ip address ของผู้เข้าห้องแชต
socket.on('sendMsg', function(data) { // เมื่อมีการ emit มาที 'sendMsg'
if (data.message === '' || data.message === null) { // ถ้า message เป็นค่าว่าง หรือไม่มีค่า
return; // หยุดฟังชั่น
}else if(data.message.indexOf('<')>=0){ // ถ้ามีการส่ง < มาด้วย (กรณีกัน การใส่ code เข้ามาในห้องแชต)
socket.disconnect(); // บังคับผู้ส่งให้ออกจากห้อง
return; // หยุดฟังชั่น
}
if (name[socket.id] !== null) { // ถ้าชื่อผู้ใช้ของ socket คนนี้ไม่เป็นค่าว่าง
var msg = name[socket.id] + "(" + ipv4 + ") : " + data.message.trim(); // ให้ส่งข้อมูลกลับไปในรูปแบบ
// ชื่อ (ไอพี) : ข้อความ
console.log(msg); // log โชว์ข้อความ
io.sockets.emit('sendMsg', {message: msg}); // emit ไปหา client ทุกคนผ่านท่อ 'sendMsg'
}
});
socket.on('sendName', function(data) {// เมื่อมีการส่งข้อมูลจาก client ผ่านท่อ 'sendName'
if (data.name === "" || data.name === null) {//ตรวจสอบข้อมูลว่าง
socket.disconnect(); // ถ้าว่างให้ disconnect
} else {
console.log(data.name.trim() + "(" + ipv4 + ") 's connected");// ถ้าไม่ว่าง Log ชื่อกับ IP
name[socket.id] = data.name; // นำชื่อมาเก็บไว้ใน name โดยมี คีย์ประจำตัวเป็น socket id
io.sockets.emit('sendName', {name: data.name.trim() + "(" + ipv4 + ") 's connected"});
// emit ข้อมูลผ่านท่อ 'sendName' โดยมีพารามีเตอร์เป็น array มีname เป็น key มีค่าเป็น ชื่อและ ip
}
});
socket.on('disconnect', function() {// ถ้ามีการ Disconnect
console.log(name[socket.id] + " was disconnected"); // Log ชื่อที่ทำการ disconnect
io.sockets.emit('disconnected', {name: name[socket.id]}); // ส่งข้อมูลชื่อ disconnect ไปยัง client ทุกตัว
});
});
-----------------------------------------------
ทำการสร้างไฟล์ index.php (ตามตัวอย่างในบทความ แก้ไข 1 จุดคือ
เดิม Code
wsUri = 'http://' + (docum.....
เปลี่ยนเป็น Code
wsUri = 'https://' + (docum.....
Code
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" src="https://www.my-domain.com/node_modules/socket.io-client/dist/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-1.9.1.js"></script>
</script>
<script>
$(document).ready(function() {
$('#chatboard').text("");
var name = prompt("Please enter your name?", ""); // รับ input ค่า name
wsUri = 'https://' + (document.location.host) + ':9999'; // เขียนurlติดต่อไปยัง server ในพอร์ต 9999
var socket = io.connect(wsUri); // ทำการติดต่อ
socket.emit('sendName', {name: name.trim()}); // ส่งชื่อผ่านท่อ sendName ไป
socket.on('sendName', function(data) { // ถ้ามีการส่งข้อมูลผ่าน ท่อ sendName
$('#chatboard').append(data.name.trim() + "\r\n"); // เอาค่าที่ได้มาใส่ใน textarea
});
socket.on('sendMsg', function(data) {
$('#chatboard').append(data.message.trim() + "\r\n");
});
socket.on('disconnected', function(data) {
$('#chatboard').append(data.name.trim() + "'s Disconnect\r\n");
});
$('#messagebox').keypress(function(evt) {// กรณีที่มีการกดปุ่ม
if (event.which === 13) { // ถ้าเป็นปุ่ม enter ให้ส่งข้อมูลไปยัง server
var message = $('#messagebox').val();
$('#messagebox').val(""); // clear ค่าในช่องใส่ข้อความ
socket.emit('sendMsg', {message: message});
}
});
$('#button').click(function() { // มีผลเหมือนกับฟังชั่น keypress เพียงแต่เป็นการคลิ๊กปุ่ม
var message = $('#messagebox').val();
$('#messagebox').val("");
socket.emit('sendMsg', {message: message});
});
});
</script>
</head>
<body>
<div class="chat-room">
<table>
<tr>
<td colspan="2">
<textarea id="chatboard" readonly="readonly" rows='10' cols='50' style='resize:none;'>
</textarea>
</td>
</tr>
<tr>
<td>
<input type='text' id='messagebox' maxlength="100" style='width:100%;'/>
</td>
<td>
<input type='button' id="button" value='Send'/>
</td>
</tr>
</table>
</div>
</body>
</html>
----------------------------------------------------------------------
ทำการ run ssh
Code
node application.js
แสดงข้อความ
Code
server start 9999
------------------------------------------------------------------------
ทำการโหลดเว็บผ่าน Browser
Code
https://www.domain.com
ทำการตั้งชื่อและหลังจากพิมพ์ข้อความและกดส่งข้อความ ไม่มีข้อความอะไรแสดงเลย และมี error ดังรูป
ไม่ทราบว่าผมทำตรงส่วนไหนผิด จึงไม่สามารถแสดงผมได้ตามตัวอย่างในบทความครับ ขอบคุณครับ
Tag : PHP, Node.js