Go 기반 WebSocket 통신
개시하다
WebSocket 정보
GET /ws HTTP/1.1
Host: server.localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://localhost
Sec-WebSocket-Version: 13
Upgrade
,Connection
헤더 부여를 통해 서버에 사용된 프로토콜이 HTTP에서 WebSocket으로 업그레이드되었음을 알립니다.Sec-WebSocket-Key
헤드는 특정 클라이언트와의 연결 여부를 판정하는 데 사용되며 사칭을 방지할 수 있다.Sec-WebSocket-Version
헤더에 대해 현재 버전의 13을 설정합니다.HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Accept
헤더의 값과 Sec-WebSocket-Key
헤더의 값이 대응한다.이후 WebSocket을 사용하여 클라이언트 서버 간 양방향 통신이 가능합니다.이루어지다
$ tree
.
├── main.go
├── public
│ ├── index.html
│ └── main.js
..
서버 측 설치
1.15.5
은 웹 프레임워크Echo에서 사용됩니다.버전은 v4.2.1
입니다.package main
import (
"fmt"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"golang.org/x/net/websocket"
)
func handleWebSocket(c echo.Context) error {
websocket.Handler(func(ws *websocket.Conn) {
defer ws.Close()
// 初回のメッセージを送信
err := websocket.Message.Send(ws, "Server: Hello, Client!")
if err != nil {
c.Logger().Error(err)
}
for {
// Client からのメッセージを読み込む
msg := ""
err = websocket.Message.Receive(ws, &msg)
if err != nil {
c.Logger().Error(err)
}
// Client からのメッセージを元に返すメッセージを作成し送信する
err := websocket.Message.Send(ws, fmt.Sprintf("Server: \"%s\" received!", msg))
if err != nil {
c.Logger().Error(err)
}
}
}).ServeHTTP(c.Response(), c.Request())
return nil
}
func main() {
e := echo.New()
e.Use(middleware.Logger())
e.Static("/", "public")
e.GET("/ws", handleWebSocket)
e.Logger.Fatal(e.Start(":8080"))
}
클라이언트 설치
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>WebSocket</title>
<script src="main.js"></script>
</head>
<body>
<p id="output"></p>
<input type="text" id="input"></p>
<p><input type="submit" class="btn" value="送信"></p>
</body>
</html>
document.addEventListener('DOMContentLoaded', () => {
let loc = window.location;
let uri = 'ws:';
if (loc.protocol === 'https:') {
uri = 'wss:';
}
uri += '//' + loc.host;
uri += loc.pathname + 'ws';
const ws = new WebSocket(uri)
ws.onopen = function() {
console.log('Connected')
}
ws.onmessage = function(evt) {
let out = document.getElementById('output');
out.innerHTML += evt.data + '<br>';
}
const btn = document.querySelector('.btn')
btn.addEventListener('click', () => {
ws.send(document.getElementById('input').value)
})
});
확인
http://localhost:8080
에 액세스하여 텍스트 상자에 문자를 입력하고 [보내기] 버튼을 누르면 서버에서 입력한 문자열이 포함된 메시지가 반환됩니다.동작 확인을 위한 이미지는 다음과 같습니다.Reference
이 문제에 관하여(Go 기반 WebSocket 통신), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/empenguin/articles/bcf95c19451020텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)