unisbadri.com » Python Java Golang Typescript Kotlin Ruby Rust Dart PHP
Web Socket

Web Socket #

WebSocket di Golang #

WebSocket adalah protokol komunikasi yang memungkinkan interaksi dua arah antara client dan server melalui koneksi tunggal yang terjaga. Ini sangat berguna untuk aplikasi real-time seperti obrolan, notifikasi, atau game online. Golang memiliki beberapa paket pihak ketiga yang mendukung WebSocket, salah satu yang paling populer adalah gorilla/websocket.

Instalasi gorilla/websocket #

Pertama, kita perlu menginstal paket gorilla/websocket. Jalankan perintah berikut di terminal:

go get github.com/gorilla/websocket

Contoh WebSocket Server #

Berikut adalah contoh implementasi server WebSocket sederhana menggunakan gorilla/websocket.

package main

import (
    "fmt"
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

func handler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        fmt.Println("Error upgrading connection:", err)
        return
    }
    defer conn.Close()

    for {
        messageType, message, err := conn.ReadMessage()
        if err != nil {
            fmt.Println("Error reading message:", err)
            break
        }
        fmt.Printf("Received: %s\n", message)

        err = conn.WriteMessage(messageType, message)
        if err != nil {
            fmt.Println("Error writing message:", err)
            break
        }
    }
}

func main() {
    http.HandleFunc("/", handler)
    fmt.Println("WebSocket server started on :8080")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        fmt.Println("Error starting server:", err)
    }
}

Contoh WebSocket Client #

Berikut adalah contoh implementasi client WebSocket yang berkomunikasi dengan server WebSocket di atas.

package main

import (
    "fmt"
    "log"
    "os"
    "bufio"
    "github.com/gorilla/websocket"
)

func main() {
    var addr = "localhost:8080"
    u := "ws://" + addr

    conn, _, err := websocket.DefaultDialer.Dial(u, nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer conn.Close()

    for {
        reader := bufio.NewReader(os.Stdin)
        fmt.Print("Enter message: ")
        text, _ := reader.ReadString('\n')

        err := conn.WriteMessage(websocket.TextMessage, []byte(text))
        if err != nil {
            fmt.Println("Error writing message:", err)
            return
        }

        _, message, err := conn.ReadMessage()
        if err != nil {
            fmt.Println("Error reading message:", err)
            return
        }
        fmt.Printf("Received: %s\n", message)
    }
}

Penjelasan Kode #

Server WebSocket #

  1. Upgrader: websocket.Upgrader digunakan untuk meng-upgrade koneksi HTTP menjadi koneksi WebSocket.

    • ReadBufferSize dan WriteBufferSize menentukan ukuran buffer untuk pembacaan dan penulisan.
    • CheckOrigin digunakan untuk memeriksa asal permintaan. Di sini, semua permintaan diizinkan (return true).
  2. Handler: Fungsi handler digunakan untuk meng-handle permintaan WebSocket.

    • Koneksi di-upgrade menggunakan upgrader.Upgrade.
    • Pesan dibaca dari koneksi menggunakan conn.ReadMessage.
    • Pesan yang diterima dikirim kembali ke client menggunakan conn.WriteMessage.
  3. Main Function:

    • http.HandleFunc("/", handler) menambahkan route handler untuk endpoint /.
    • Server dimulai pada port 8080 menggunakan http.ListenAndServe.

Client WebSocket #

  1. Dialer: Menggunakan websocket.DefaultDialer.Dial untuk menghubungkan ke server WebSocket pada ws://localhost:8080.

  2. Main Loop

    • Pesan dikirim ke server menggunakan conn.WriteMessage.
    • Pesan diterima dari server menggunakan conn.ReadMessage.
    • Pesan yang dikirim dan diterima ditampilkan di konsol.

Kesimpulan #

WebSocket menyediakan komunikasi dua arah yang efisien antara client dan server. Dengan menggunakan paket gorilla/websocket, Anda dapat dengan mudah mengimplementasikan server dan client WebSocket di Golang. Contoh di atas menunjukkan dasar dari cara kerja WebSocket dan dapat diperluas sesuai dengan kebutuhan aplikasi real-time Anda.

« Socket
Web Server »