โปรแกรม Chat ทำจาก Nodejs & Socket.io และ JQuery
Nodejs & Socket.io
Socket.io เป็น Library ของ Nodejs เป็น script ฝั่ง server side ซึ่งจะทำให้ website สามารถทำงานแบบ real-time ได้
ซึ่งการทำงานจะประกอบไปด้วย 2 ส่วนคือ
1.Javascript ฝั่ง Server Side ซึ่งจะถูกรันด้วย NodeJs
2.Javascript ฝั่ง Client Side ซึ่งจะรันผ่าน Web browser ตามปกติ
วิธีการลงก็ง่ายๆ เลย
เพียงแค่ไปโหลด Nodejs มา Install ลงเครื่อง เสร็จแล้วเราก็หาที่ๆต้องการสร้างโฟลเดอร์สำหรับ Server ขึ้นมา
เปิด command และไปยังโฟลเดอร์ที่สร้างขึ้น
พิมโค้ดสำหรับ Install
ถ้าสำเร็จจะไม่มี Error ขึ้นมา เสร็จแล้วให้สร้าง ไฟล์ Javascript อะไรสักชื่อที่ไว้สำหรับใส่ Code ฝั่ง Server (ของผมเป็น application.js)
ต่อมา ให้เราสร้างโฟลเดอร์สำหรับ Web Application อาจจะอยู่ใน www ของ AppServ (ผมตั้งเป็น chatws) สร้าง index.php นำไฟล์ JQuery มาลง
สุดท้ายนำเอา ไฟล์ socket.io.js ที่อยู่ใน โฟลเดอร์ที่ลงSocket.io\node_module\socket.io\node_modules\socket.io-client
ไปไว้ในโฟลเดอร์สำหรับ Web Application
เท่านี้ถือว่าการเตรียมพร้อมเสร็จสิ้น
ตัวอย่าง Chat Program
จากตัวอย่างนี้จะเป็น Chat Program แบบง่ายๆ ที่จะใช้เป็นตัวอย่าง
application.js
ในส่วนนี้ socket.emit มีไว้ใช้ในการ ส่งข้อมูลไปหา client ที่ส่งมา
แต่ถ้าเราใช้ io.sockets.emit จะเป็นการส่งข้อมูลไปหา client ทุกคน
index.html

Nodejs & Socket.io
Socket.io เป็น Library ของ Nodejs เป็น script ฝั่ง server side ซึ่งจะทำให้ website สามารถทำงานแบบ real-time ได้
ซึ่งการทำงานจะประกอบไปด้วย 2 ส่วนคือ
1.Javascript ฝั่ง Server Side ซึ่งจะถูกรันด้วย NodeJs
2.Javascript ฝั่ง Client Side ซึ่งจะรันผ่าน Web browser ตามปกติ
วิธีการลงก็ง่ายๆ เลย
เพียงแค่ไปโหลด Nodejs มา Install ลงเครื่อง เสร็จแล้วเราก็หาที่ๆต้องการสร้างโฟลเดอร์สำหรับ Server ขึ้นมา
เปิด command และไปยังโฟลเดอร์ที่สร้างขึ้น
พิมโค้ดสำหรับ Install
npm install socket.io
ถ้าสำเร็จจะไม่มี Error ขึ้นมา เสร็จแล้วให้สร้าง ไฟล์ Javascript อะไรสักชื่อที่ไว้สำหรับใส่ Code ฝั่ง Server (ของผมเป็น application.js)
ต่อมา ให้เราสร้างโฟลเดอร์สำหรับ Web Application อาจจะอยู่ใน www ของ AppServ (ผมตั้งเป็น chatws) สร้าง index.php นำไฟล์ JQuery มาลง
สุดท้ายนำเอา ไฟล์ socket.io.js ที่อยู่ใน โฟลเดอร์ที่ลงSocket.io\node_module\socket.io\node_modules\socket.io-client
ไปไว้ในโฟลเดอร์สำหรับ Web Application
เท่านี้ถือว่าการเตรียมพร้อมเสร็จสิ้น
ตัวอย่าง Chat Program
จากตัวอย่างนี้จะเป็น Chat Program แบบง่ายๆ ที่จะใช้เป็นตัวอย่าง
application.js
01.var serv = require("socket.io"); // เรียกใช้ socket.io02.var io = serv.listen(9999); // เปิดเซิฟเวอร์ที่ port 999903.console.log("server start"); // log ที่ command ว่า server start ปล. ให้ผลเหมือน System.out.println();04.var name = {}; // เตียมตัวแปร name สำหรับเก็บชื่อผู้เข้าห้องแชต05.io.sockets.on('connection', function(socket) { // เมื่อมีการ connect เข้ามา06.var ipv4 = socket.request.socket.remoteAddress; // เก็บ ip address ของผู้เข้าห้องแชต07. 08.socket.on('sendMsg', function(data) { // เมื่อมีการ emit มาที 'sendMsg'09.if (data.message === '' || data.message === null) { // ถ้า message เป็นค่าว่าง หรือไม่มีค่า10.return; // หยุดฟังชั่น11.}else if(data.message.indexOf('<')>=0){ // ถ้ามีการส่ง < มาด้วย (กรณีกัน การใส่ code เข้ามาในห้องแชต)12.socket.disconnect(); // บังคับผู้ส่งให้ออกจากห้อง13.return; // หยุดฟังชั่น14.}15.if (name[socket.id] !== null) { // ถ้าชื่อผู้ใช้ของ socket คนนี้ไม่เป็นค่าว่าง16.var msg = name[socket.id] + "(" + ipv4 + ") : " + data.message.trim(); // ให้ส่งข้อมูลกลับไปในรูปแบบ17.// ชื่อ (ไอพี) : ข้อความ18.console.log(msg); // log โชว์ข้อความ 19.io.sockets.emit('sendMsg', {message: msg}); // emit ไปหา client ทุกคนผ่านท่อ 'sendMsg'20.}21.});22.socket.on('sendName', function(data) {// เมื่อมีการส่งข้อมูลจาก client ผ่านท่อ 'sendName'23.if (data.name === "" || data.name === null) {//ตรวจสอบข้อมูลว่าง24.socket.disconnect(); // ถ้าว่างให้ disconnect25.} else {26.console.log(data.name.trim() + "(" + ipv4 + ") 's connected");// ถ้าไม่ว่าง Log ชื่อกับ IP27.name[socket.id] = data.name; // นำชื่อมาเก็บไว้ใน name โดยมี คีย์ประจำตัวเป็น socket id28.io.sockets.emit('sendName', {name: data.name.trim() + "(" + ipv4 + ") 's connected"});29.// emit ข้อมูลผ่านท่อ 'sendName' โดยมีพารามีเตอร์เป็น array มีname เป็น key มีค่าเป็น ชื่อและ ip30.}31.});32.socket.on('disconnect', function() {// ถ้ามีการ Disconnect33.console.log(name[socket.id] + " was disconnected"); // Log ชื่อที่ทำการ disconnect34.io.sockets.emit('disconnected', {name: name[socket.id]}); // ส่งข้อมูลชื่อ disconnect ไปยัง client ทุกตัว35.});36.});ในส่วนนี้ socket.emit มีไว้ใช้ในการ ส่งข้อมูลไปหา client ที่ส่งมา
แต่ถ้าเราใช้ io.sockets.emit จะเป็นการส่งข้อมูลไปหา client ทุกคน
index.html
01.<html>02.<head>03.<meta charset="UTF-8">04.<title></title>05.<script src="socket.io.js">06.</script>07.<script src="jquery-1.9.1.js">08.</script>09.<script>10.$(document).ready(function() {11.$('#chatboard').text("");12.var name = prompt("Please enter your name?", ""); // รับ input ค่า name13.wsUri = 'http://' + (document.location.host) + ':9999'; // เขียนurlติดต่อไปยัง server ในพอร์ต 999914.var socket = io.connect(wsUri); // ทำการติดต่อ15.socket.emit('sendName', {name: name.trim()}); // ส่งชื่อผ่านท่อ sendName ไป16.socket.on('sendName', function(data) { // ถ้ามีการส่งข้อมูลผ่าน ท่อ sendName17.$('#chatboard').append(data.name.trim() + "\r\n"); // เอาค่าที่ได้มาใส่ใน textarea18.});19.socket.on('sendMsg', function(data) {20.$('#chatboard').append(data.message.trim() + "\r\n");21.});22.socket.on('disconnected', function(data) {23.$('#chatboard').append(data.name.trim() + "'s Disconnect\r\n");24.});25.$('#messagebox').keypress(function(evt) {// กรณีที่มีการกดปุ่ม26.if (event.which === 13) { // ถ้าเป็นปุ่ม enter ให้ส่งข้อมูลไปยัง server27.var message = $('#messagebox').val();28.$('#messagebox').val(""); // clear ค่าในช่องใส่ข้อความ29.socket.emit('sendMsg', {message: message});30.}31.});32.$('#button').click(function() { // มีผลเหมือนกับฟังชั่น keypress เพียงแต่เป็นการคลิ๊กปุ่ม33.var message = $('#messagebox').val();34.$('#messagebox').val("");35.socket.emit('sendMsg', {message: message});36.});37. 38.});39. 40.</script>41.</head>42.<body>43.<div class="chat-room">44.<table>45.<tr>46.<td colspan="2">47.<textarea id="chatboard" readonly="readonly" rows='10' cols='50'style='resize:none;'>48. 49.</textarea>50.</td>51.</tr>52.<tr>53.<td>54.<input type='text' id='messagebox' maxlength="100"style='width:100%;'/>55.</td>56.<td>57.<input type='button' id="button" value='Send'/>58.</td>59.</tr>60.</table>61.</div>62.</body>63.</html>
crd : thaicreate