基于go websocket写一个聊天室
生活随笔
收集整理的這篇文章主要介紹了
基于go websocket写一个聊天室
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
上一篇介紹了一下go websocket,這篇blog主要是通過websocket寫一個(gè)聊天室。
先寫前端
這里面有三個(gè)組件,一個(gè)log記錄,一個(gè)是msg消息發(fā)送,一個(gè)是發(fā)送按鈕。下面給這個(gè)兩個(gè)組件添加事件,
<script type="text/javascript"> window.onload = function () {var conn;var msg = document.getElementById("msg");var log = document.getElementById("log");function appendLog(item) {var doScroll = log.scrollTop > log.scrollHeight - log.clientHeight - 1;log.appendChild(item);if (doScroll) {log.scrollTop = log.scrollHeight - log.clientHeight;}}document.getElementById("form").onsubmit = function () {if (!conn) {return false;}if (!msg.value) {return false;}conn.send(msg.value);msg.value = "";return false;};if (window["WebSocket"]) {conn = new WebSocket("ws://" + document.location.host + "/ws");conn.onclose = function (evt) {var item = document.createElement("div");item.innerHTML = "<b>Connection closed.</b>";appendLog(item);};conn.onmessage = function (evt) {var messages = evt.data.split('\n');for (var i = 0; i < messages.length; i++) {var item = document.createElement("div");item.innerText = messages[i];appendLog(item);}};} else {var item = document.createElement("div");item.innerHTML = "<b>Your browser does not support WebSockets.</b>";appendLog(item);} }; </script>這個(gè)里面先對(duì)發(fā)送按鈕添加事件,每當(dāng)按下時(shí)候執(zhí)行send,將數(shù)據(jù)發(fā)送到后端;當(dāng)后端發(fā)送數(shù)據(jù)到前端,就執(zhí)行appendLog追加內(nèi)容。好了,介紹完這個(gè)就介紹后端。后端里面先介紹主程序
func main() {flag.Parse()hub := newHub()go hub.run()http.HandleFunc("/", serveHome)http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {serveWs(hub, w, r)})err := http.ListenAndServe(*addr, nil)if err != nil {log.Fatal("ListenAndServe: ", err)} }這個(gè)里面hub是一個(gè)消息的分發(fā)器,就是把消息發(fā)送到每個(gè)客戶端。這個(gè)里面把消息廣播到每個(gè)聊天的client。
func (h *Hub) run() {for {select {case client := <-h.register:h.clients[client] = truecase client := <-h.unregister:if _, ok := h.clients[client]; ok {delete(h.clients, client)close(client.send)}case message := <-h.broadcast:for client := range h.clients {select {case client.send <- message:default:close(client.send)delete(h.clients, client)}}}} }還有一個(gè)是serverWs的實(shí)現(xiàn)
go client.writePump()go client.readPump()就是負(fù)責(zé)client的讀和寫。
func (c *Client) readPump() {defer func() {c.hub.unregister <- cc.conn.Close()}()c.conn.SetReadLimit(maxMessageSize)c.conn.SetReadDeadline(time.Now().Add(pongWait))c.conn.SetPongHandler(func(string) error { c.conn.SetReadDeadline(time.Now().Add(pongWait)); return nil })for {_, message, err := c.conn.ReadMessage()if err != nil {if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {log.Printf("error: %v", err)}break}message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1))c.hub.broadcast <- message} }讀很簡(jiǎn)單,通過ReadMessage讀取
寫也是類似,
那么這個(gè)聊天室就寫好了。
總結(jié)
以上是生活随笔為你收集整理的基于go websocket写一个聊天室的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ocp 考试相关资料
- 下一篇: 名言名句积累