Dev to webs {Coding…}

เรียนรู้การพัฒนาซอฟเวอร์ เพื่อความรู้ที่ยั่งยืน

บทที่ 39: การเพิ่มฟีเจอร์แบบ Realtime ในแอปพลิเคชัน Vue.js ด้วย WebSocket

1. ทำไมต้องใช้ WebSocket?

WebSocket เป็นโปรโตคอลสำหรับการสื่อสารแบบสองทาง (bidirectional communication) ที่ช่วยให้การอัปเดตข้อมูลระหว่าง Client และ Server เป็นไปแบบ Realtime เหมาะสำหรับแอปพลิเคชันที่ต้องการข้อมูลแบบทันที เช่น:

  • ระบบแชท
  • Dashboard Realtime
  • การแจ้งเตือนทันที (Push Notification)

2. วิธีการทำงานของ WebSocket

WebSocket สร้างการเชื่อมต่อที่คงอยู่ระหว่าง Client และ Server โดยทั้งสองฝ่ายสามารถส่งข้อมูลไปมาได้ตลอดเวลา โดยไม่ต้องเปิดการเชื่อมต่อใหม่ในทุกคำขอ


3. การใช้งาน WebSocket ใน Vue.js

3.1 การสร้าง WebSocket Connection

ใช้ JavaScript WebSocket API เพื่อสร้างการเชื่อมต่อ

ตัวอย่าง:

const socket = new WebSocket('ws://localhost:8080');

socket.onopen = () => {
  console.log('WebSocket is connected');
  socket.send('Hello Server!');
};

socket.onmessage = (event) => {
  console.log('Message from server: ', event.data);
};

socket.onclose = () => {
  console.log('WebSocket is closed');
};

socket.onerror = (error) => {
  console.error('WebSocket error: ', error);
};

3.2 การเชื่อม WebSocket กับ Vue Component

ตัวอย่าง:

<template>
  <div>
    <h1>Realtime Messages</h1>
    <ul>
      <li v-for="message in messages" :key="message">{{ message }}</li>
    </ul>
    <input v-model="newMessage" @keyup.enter="sendMessage" placeholder="Type a message" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      socket: null,
      messages: [],
      newMessage: ''
    };
  },
  methods: {
    sendMessage() {
      if (this.newMessage.trim()) {
        this.socket.send(this.newMessage);
        this.newMessage = '';
      }
    }
  },
  mounted() {
    this.socket = new WebSocket('ws://localhost:8080');

    this.socket.onmessage = (event) => {
      this.messages.push(event.data);
    };
  },
  beforeUnmount() {
    this.socket.close();
  }
};
</script>

4. การใช้ไลบรารี Socket.IO

Socket.IO ช่วยเพิ่มความสะดวกในการจัดการ WebSocket และรองรับฟีเจอร์เพิ่มเติม เช่น การ Retry เมื่อการเชื่อมต่อล้มเหลว

การติดตั้ง Socket.IO:

npm install socket.io-client

การใช้งานใน Vue.js:

ตัวอย่าง:

import { io } from 'socket.io-client';

export default {
  data() {
    return {
      socket: null,
      messages: []
    };
  },
  methods: {
    sendMessage(message) {
      this.socket.emit('chat message', message);
    }
  },
  mounted() {
    this.socket = io('http://localhost:3000');

    this.socket.on('chat message', (msg) => {
      this.messages.push(msg);
    });
  },
  beforeUnmount() {
    this.socket.disconnect();
  }
};

5. การตั้งค่า WebSocket Server ด้วย Node.js

การติดตั้ง WebSocket Server:

npm install ws

ตัวอย่างเซิร์ฟเวอร์ WebSocket:

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (socket) => {
  console.log('Client connected');

  socket.on('message', (message) => {
    console.log('Received: ', message);
    server.clients.forEach((client) => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(message);
      }
    });
  });

  socket.on('close', () => {
    console.log('Client disconnected');
  });
});

6. การปรับปรุงประสิทธิภาพและความปลอดภัยของ WebSocket

6.1 การจัดการ Connection Limit

  • จำกัดจำนวนการเชื่อมต่อพร้อมกันเพื่อป้องกันการใช้งานทรัพยากรเกินขอบเขต

6.2 การตรวจสอบ Token

  • ใช้ JWT (JSON Web Token) เพื่อยืนยันตัวตนของผู้ใช้ก่อนอนุญาตให้เชื่อมต่อ

ตัวอย่าง:

const WebSocket = require('ws');
const jwt = require('jsonwebtoken');

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (socket, req) => {
  const token = req.headers['sec-websocket-protocol'];
  try {
    const decoded = jwt.verify(token, 'your-secret-key');
    console.log('User authenticated:', decoded);
  } catch (err) {
    console.log('Invalid token');
    socket.close();
  }
});

6.3 การใช้ Load Balancer

  • ใช้ Load Balancer เช่น Nginx เพื่อกระจายการเชื่อมต่อไปยังหลายเซิร์ฟเวอร์

ตัวอย่างการตั้งค่า Nginx:

upstream websocket_servers {
  server 127.0.0.1:8080;
  server 127.0.0.1:8081;
}

server {
  listen 80;

  location / {
    proxy_pass http://websocket_servers;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

7. สรุป

ในบทนี้ คุณได้เรียนรู้วิธีเพิ่มฟีเจอร์แบบ Realtime ในแอปพลิเคชัน Vue.js โดยใช้ WebSocket และ Socket.IO พร้อมทั้งเรียนรู้การตั้งค่า WebSocket Server และการเพิ่มความปลอดภัย เช่น การใช้ JWT และ Load Balancer การเพิ่มฟีเจอร์ Realtime ช่วยให้แอปพลิเคชันตอบสนองต่อผู้ใช้ได้ทันทีและสร้างประสบการณ์ที่ดีขึ้น

ในบทถัดไป เราจะพูดถึงการบูรณาการแอปพลิเคชัน Vue.js กับเทคโนโลยี Serverless!