Program Chat from Nodejs & Socket.io และ JQuery (JS)

โปรแกรม 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


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.io
02.var io = serv.listen(9999);  // เปิดเซิฟเวอร์ที่ port 9999
03.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(); // ถ้าว่างให้ disconnect
25.else {
26.console.log(data.name.trim() + "(" + ipv4 + ") 's connected");// ถ้าไม่ว่าง Log ชื่อกับ IP
27.name[socket.id] = data.name; // นำชื่อมาเก็บไว้ใน name โดยมี คีย์ประจำตัวเป็น socket id
28.io.sockets.emit('sendName', {name: data.name.trim() + "(" + ipv4 + ") 's connected"});
29.// emit ข้อมูลผ่านท่อ 'sendName' โดยมีพารามีเตอร์เป็น array มีname เป็น key มีค่าเป็น ชื่อและ ip
30.}
31.});
32.socket.on('disconnect'function() {// ถ้ามีการ Disconnect
33.console.log(name[socket.id] + " was disconnected"); // Log ชื่อที่ทำการ disconnect
34.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 ค่า name
13.wsUri = 'http://' + (document.location.host) + ':9999'; // เขียนurlติดต่อไปยัง server ในพอร์ต 9999
14.var socket = io.connect(wsUri); // ทำการติดต่อ
15.socket.emit('sendName', {name: name.trim()}); // ส่งชื่อผ่านท่อ sendName ไป
16.socket.on('sendName'function(data) { // ถ้ามีการส่งข้อมูลผ่าน ท่อ sendName
17.$('#chatboard').append(data.name.trim() + "\r\n"); // เอาค่าที่ได้มาใส่ใน textarea
18.});
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 ให้ส่งข้อมูลไปยัง server
27.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>


outputchatws





crd : thaicreate