Tutorial Membuat Fitur Kirim Pesan Sederhana Menggunakan Websoket Pada Golang


 
Assalamu'alaikum Wr. Wb. 

          Pada tutorial saya kali ini saya akan membahas tentang penerapan websocket pada Golang, websocket adalah protokol yang memungkinkan komunikasi dua arah antara server dan client secara real-time, dengan websocket client dapat langsung mendapatkan data dari server tanpa melakukan request dari client terlebih dahulu, websocket sering digunakan pada aplikasi atau fitur chat yang memerlukan data real-time saat user melakukan komunikasi chatting dengan skenario client 1 mengirimkan pesan kepada client 2 dan client 2 dapat langsung menerima pesan tanpa harus merequest nya terlebih dahulu melainkan cukup dengan mengkoneksikan aplikasi client ke server, pada tutorial kali ini kita akan menggunakan plugin gorilla/websocket dan menggunakan Mac OS jadi untuk sistem operasi lain bisa menyesuaikan dengan perintah sesuai sistem operasi yang digunakan, langsung saja untuk tutorial penerapan websocket pada Golang adalah sebagai berikut.

  1. Install Golang
            
    Untuk anda yang belum menginstall golang, maka anda perlu menginstall nya terlebih dahulu, anda dapat masuk ke website https://go.dev/dl/ untuk mendownload dan menginstall golang pada komputer anda.
  2. Buat directory project golang anda dan install plugin gorilla/websocket
              
    Jika anda belum memiliki project golang anda maka anda perlu membuatnya terlebih dahulu, contoh dengan menjalankan perintah beikut pada terminal:

              mkdir golang-ws && cd golang-ws

              Selanjutnya buat module untuk aplikasi golang anda dengan menjalankan perintah di bawah pada terminal, dengan menjalankan perintah berikut maka akan menambahkan file go.mod yang berisi nama module project go anda di bagian paling atas:

              go mod init golangws

             Jika pada file go.mod anda terdapat error invalid go version '1.21.0': must match format 1.23, maka anda perlu menghapus 0 setelah titik terakhir sehingga kodenya menjadi go 1.21.

              Jika anda sudah memiliki project golang anda atau sudah menjalankan perintah di atas maka langkah selanjutnya adalah menginstall plugin gorilla/websocket dengan menjalankan perintah berikut pada terminal:

               go get github.com/gorilla/mux github.com/gorilla/websocket

  3. Buat router websocket anda
            
    Langkah selanjutnya adalah membuat router untuk aplikasi websocket golang anda, pertama buat file main.go dengan menjalankan perintah berikut:

            touch main.go

            Setelah file main.go sudah dibuat maka anda tinggal masuk ke project golang anda menggunakan kode editor anda, jika anda menggunakan Visual Studio Code anda bisa mengetikkan perintah berikut pada terminal yang sudah berlokasi pada root directory project golang-ws anda:

            code .

            Setelah masuk ke projek aplikasi anda, maka anda perlu menambahkan kode berikut pada file main.go:



    package main

    import (
         "log"
         "net/http"
         "golangws/controllers/messagecontroller"
         "github.com/gorilla/mux"
    )

    var routers = func(router *mux.Router) {
          routerWS := router.PathPrefix("/ws").Subrouter();  // untuk membuat subrouter

          routerWS.HandleFunc("/handle-message", messagecontroller.HandleMessage) // mengambil function HandleMessage dari messageController
    }

    func main() {
         router := mux.NewRouter();
         
         routers(router)

         log.Fatal(http.ListenAndServe(":5000",router))
    }



  4. Membuat controller
             Pada kode sebelumnya kita mengimport messagecontroller dan memanggil function sendMessage dari messagecontroller, sebenarnya membuat file controller terpisah adalah opsional hanya saja disini saya menggunakan file messagecontroller.go pada directory folder constollers/messagecontroller/messagecontroller.go agar lebih terstruktur dan rapi, jalankan perintah berikut untuk membuat file messagecontroller.go di folder controllers/messagecontroller di root project golang anda

            mkdir controllers && cd controllers && mkdir messagecontroller && cd messagecontroller && touch messagecontroller.go

             Setelah anda menjalankan perintah di atas lalu masuk ke file messagecontroller.go dan tuliskan kode berikut pada file messagecontroller.go:


    package messagecontroller

    import (
         "log"
         "net/http"
         "strconv"

         "github.com/gorilla/websocket"
    )

    var clients = make(map[string]*websocket.Conn)

    type Message struct {
          To            int      `json:"to"`
          Sender     int      `json:"sender"`
          Message  string  `json:"message"`
    }

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

    func HandleMessage(w http.ResponseWriter, r *http.Request){

          clientID := r.URL.Query().Get("clientID")

          if clientID == "" {
              log.Println("clientID required!")
              return
          }

          conn, err := upgrader.Upgrade(w,r,nil)
          
          if err != nil {
              log.Println(err)
              return;
          }

           defer conn.Close()

           clients[clientID] = conn

           for {

              var msg Message
                
              err := conn.ReadJSON(&msg)
              if err != nil {
                  log.Printf("error: %v",err)
                  delete(clients,clientID)
        break
              }
              
               if msg.To == 0 || msg.Sender == 0 {
                  delete(clients,clientID)
                  break
               }

                clientTo := strconv.Itoa(msg.To)

                if targetConn, ok := clients[clientTo]; ok {

                    if err := targetConn.WriteJSON(msg); err != nil {
                           log.Println("err: ", err)
                           break
                    }

               }

           }

    }


              Kode di atas hanya terdiri dari 1 function saja yang dapat digunakan untuk komunikasi antar 2 client atau lebih.

  5. Tes koneksi dan kirim pesan menggunakan postman
             
    Tahab terakhir setelah aplikasi server untuk mengirim dan menerima pesan menggunakan golang selesai maka kita sudah dapat melakukan pengetesan menggunakan Postman, sebelumnya jalankan server go anda dengan mengetikkan perintah berikut pada terminal di root directory project anda:

               go run main.go

             Selanjutnya buka posman, klik tombol new di menu navigasi kiri lalu pilih opsi websocket, ulangi sekali lagi agar membuka 2 tab untuk koneksi websocket sebagai client 1 dan client 2, lalu masukkan link dan message seperti berikut pada tab websocket:

    di tab pertama

         ws://localhost:5000/ws/handle-message/clientID=1
         
          {
               "to": 2,
               "sender": 1,
               "message": "text from client 1"
          }

    di tab kedua

         ws://localhost:5000/ws/handle-message/clientID=2
         
          {
               "to": 1,
               "sender": 2,
               "message": "text from client 1"
          }

             Jalankan tab postman dengan link dan data di atas dengan mengeklik connect dan send di kedua tab, jika berhasil maka client 1 akan mengirim pesan ke client 2 begitu juga sebaliknya.

Posting Komentar

0 Komentar