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 #
-
Upgrader:
websocket.Upgrader
digunakan untuk meng-upgrade koneksi HTTP menjadi koneksi WebSocket.ReadBufferSize
danWriteBufferSize
menentukan ukuran buffer untuk pembacaan dan penulisan.CheckOrigin
digunakan untuk memeriksa asal permintaan. Di sini, semua permintaan diizinkan (return true
).
-
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
.
- Koneksi di-upgrade menggunakan
-
Main Function:
http.HandleFunc("/", handler)
menambahkan route handler untuk endpoint/
.- Server dimulai pada port
8080
menggunakanhttp.ListenAndServe
.
Client WebSocket #
-
Dialer: Menggunakan
websocket.DefaultDialer.Dial
untuk menghubungkan ke server WebSocket padaws://localhost:8080
. -
Main Loop
- Pesan dikirim ke server menggunakan
conn.WriteMessage
. - Pesan diterima dari server menggunakan
conn.ReadMessage
. - Pesan yang dikirim dan diterima ditampilkan di konsol.
- Pesan dikirim ke server menggunakan
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.