0
0

はじめに

クライアントとサーバーで双方向通信ができるWebSocket通信を、Goでやってみました。

Goのコード

Go側では、gorilla/websocketパッケージを利用して、WebSocketの接続を待ち受けます。

接続を確立した後は、for文で永続的にコネクションを維持します。

サーバーからのプッシュ通信をゴールーチンを使って5秒ごとにクライアントに送信しています。

package main

import (
	"log"
	"net/http"
	"time"

	"github.com/gorilla/websocket"
)

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

func echo(w http.ResponseWriter, r *http.Request) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println("Upgrade error:", err)
		return
	}
	defer conn.Close()

	for {
		messageType, message, err := conn.ReadMessage()
		if err != nil {
			log.Println("Read error:", err)
			break
		}

		log.Printf("Received: %s", message)
		err = conn.WriteMessage(messageType, []byte("Hello, Client!"))
		if err != nil {
			log.Println("Write error:", err)
			break
		}

		go func() {
			for {
				time.Sleep(5 * time.Second)
				err := conn.WriteMessage(websocket.TextMessage, []byte("From Server: push message!"))
				if err != nil {
					log.Println("Write error:", err)
					break
				}
			}
		}()
	}
}

func main() {
	http.HandleFunc("/ws", echo)
	log.Fatal(http.ListenAndServe(":8080", nil))
}

クライアント側

ブラウザにはWebSocket APIが組み込まれているので、それを利用してコネクションを作ります。

サーバー側で作ったエンドポイントを指定します。

テキストを入力して送信ボタンを押すと、サーバーにデータが送信され、サーバーから返信があれば、それを画面に表示します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebSocket Client</title>
</head>
<body>
    <h1>WebSocket Client</h1>
    <input type="text" id="messageInput" placeholder="Type a message...">
    <button onclick="sendMessage()">Send</button>
    <div id="messages"></div>

    <script>
        let ws = new WebSocket("ws://localhost:8080/ws");

        ws.onopen = function() {
            console.log("WebSocket connection established");
        };

        ws.onmessage = function(event) {
            console.log("Message received:", event.data);
            let messages = document.getElementById('messages');
            let message = document.createElement('div');
            message.textContent = event.data;
            messages.appendChild(message);
        };

        ws.onerror = function(error) {
            console.log("WebSocket error:", error);
        };

        ws.onclose = function() {
            console.log("WebSocket connection closed");
        };

        function sendMessage() {
            let input = document.getElementById('messageInput');
            if (ws.readyState === WebSocket.OPEN) {
                ws.send(input.value);
                input.value = '';
            } else {
                console.log("WebSocket connection is not open");
            }
        }
    </script>
</body>
</html>

動かしてみる

go run main.go

クライアント側

データを送信でき、サーバーからの返信も受け取れています。

コンソールログにもその様子が出力されています。

スクリーンショット 2024-07-05 8.43.35.png

サーバー側

ちゃんと受け取れています。

2024/07/05 08:43:04 Received: test
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0