$ mkdir go
$ cd go
$ go mod init chat
$ mkdir -p cmd/web
$ mkdir -p internal/handlers
$ mkdir html
$ touch cmd/web/main.go
$ touch cmd/web/routes.go
$ touch html/home.jet
$ touch internal/handlers/handlers.go
$ mkdir domain
$ touch domain/connect.go
$ mkdir static
$ touch static/scripts.js
$ touch static/style.css
### モジュールの追加
$ go get github.com/CloudyKit/jet/v6
$ go get github.com/bmizerany/pat
$ go get github.com/gorilla/websocket
### handler, route.go, main.go省略
internal/handlers/hanlders.go
cmd/web/main.go
cmd/web/routes.go
### template
home/home.jet
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="/static/style.css"> </head> <body> <div class="chat-container"> <div class="chat-header"> <label for="username">Your Name</label> <input type="text" id="username" class="username" autocomplete="off" placeholder=":) selfnote"> </div> <div class="chat-body"> <ul id="message-list"> <li class="me">Sample</li> <li class="other">Sample</li> </ul> <div class="send-area"> <input type="text" id="message" class="message" autocomplete="off" placeholder="message..."> <button id="submit" class="submit"> <i class="far far-paper-plane"></i> </button> </div> </div> </div> <div class="oneline-user-container"> <ul id="online-users"> <li>XXXX</li> </ul> </div> <script src="/static/scripts.js"></script> </body> </html>
### Websocketのエンドポイント作成
/domain/connect.go
L websocket返却用の構造体
package domain type WsJsonResponse struct { Action string `json:"action"` Message string `json:"message"` }
internal/handlers/hanlders.go
import ( "chat/domain" "log" "net/http" "github.com/CloudyKit/jet/v6" "github.com/gorilla/websocket" ) var upgradeConnection = websocket.Upgrader { ReadBufferSize: 1024, WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool {return true}, } func WsEndpoint(w http.ResponseWriter, r *http.Request){ ws, err := upgradeConnection.Upgrade(w, r, nil) if err != nil { log.Println(err) } log.Println("OK client connecting") var response domain.WsJsonResponse response.Message = `<li>Connect to server</li>` err = ws.WriteJSON(response) if err != nil { log.Println(err) } }
Route.go
func routes() http.Handler { mux := pat.New() mux.Get("/", http.HandlerFunc(handlers.Home)) mux.Get("/ws", http.HandlerFunc(handlers.WsEndpoint)) // 追加 fileServer := http.FileServer(http.Dir("./static/")) mux.Get("/static/", http.StripPrefix("/static", fileServer)) return mux }
js
let socket = null; document.addEventListener("DOMContentLoaded", function(){ socket = new WebSocket("ws://192.168.34.10:8080/ws") socket.onopen = () => { console.log("successfully connected") } })
console
js
document.addEventListener("DOMContentLoaded", function(){ socket = new WebSocket("ws://192.168.34.10:8080/ws") socket.onopen = () => { console.log("successfully connected") } socket.onclose = () => { console.log("connection closed") } socket.onerror = error => { console.log("there was an error") } socket.onmessage = msg => { let j = JSON.parse(msg.data) console.log(j) } })
うーむ、postされたらonloadというイメージなんだが…