# 02. Websocket ###### tags: `golang練習` ```go package main import ( "fmt" "html/template" "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } var err error func main() { http.HandleFunc("/", page_render) http.HandleFunc("/ws", ws_connect) err := http.ListenAndServe(":3000", nil) if err != nil { log.Fatalf("ListenAndServ failed: ", err) } } func page_render(w http.ResponseWriter, r *http.Request) { t, err := template.ParseFiles("./render.html") if err != nil { log.Fatalf("template.ParseFiles failed: ", err) } t.Execute(w, nil) } func ws_connect(w http.ResponseWriter, r *http.Request) { //判斷請求是否為websocket升級請求。 if websocket.IsWebSocketUpgrade(r) { conn, err := upgrader.Upgrade(w, r, w.Header()) if err != nil { log.Fatalf("websocket upgrader.Upgrade failed: ", err) } conn.WriteMessage(websocket.TextMessage, []byte("The web socket is connected.")) // 使用goroutine接收與回覆訊息 go func() { for { t, c, err := conn.ReadMessage() if err != nil { // panic(err) // log.Fatalf("websocket conn.ReadMessage() failed: ", err) return } received := fmt.Sprintf("Message: \"%s\" received.", string(c)) conn.WriteMessage(websocket.TextMessage, []byte(received)) if t == -1 { return } } }() } else { fmt.Println("not connected") } } ``` ## main 1. **http.HandleFunc(url, handlerfunc)** Define the url and what function you would like to use in it. 1. **http.ListenAndServe(port, handler)** Run the server and keep it listening to this port. ## page_render(respond, request) 1. **template.ParesFiles(path):** Load the file and create a template. 2. **(template).Execute(respond, data)** Execute the template and set the data which contains variables which can be used like {{.}} in template. ## ws_connect(respond, request) 1. **websocket.IsWebSocketUpgrade(request)** Check if the request asked to upgrade the connection to wescoket. 1. **websocket.upgrader** Can set some configs in it and apply by .Upgrade 2. **(upgrader).Upgrade** Upgrade the connection to webscoket and return the connection. 1. **(conn).WriteMessage(message_type, message []byte)** Send message you would like to send. 1. **(conn).ReadMessage()** Read message from the client.