golang基于websocket实现的简易聊天室程序

2020-01-28 12:12:27刘景俊

本文实例讲述了golang基于websocket实现的简易聊天室。,具体如下:

先说点无关的,最近忙于工作没有更新博客,今天休息顺便把golang websocket研究了一下,挺好玩的,写了一个聊天室,分享给大家.

websocket包 : code.google.com/p/go.net/websocket

文档 : http://go.pkgdoc.org/code.google.com/p/go.net/websocket

首先安装websocket包
go get code.google.com/p/go.net/websocket

下来就是聊天室代码了,呵呵

golang websocket 聊天室
package main
import (
    "fmt"
    "io"
    "bufio"
    "net/http"
    "code.google.com/p/go.net/websocket"
    "container/list"
)
var connid int
var conns *list.List
func ChatroomServer(ws *websocket.Conn) {
    defer ws.Close()
    connid++
    id := connid
    fmt.Printf("connection id: %dn", id)
    item := conns.PushBack(ws)
    defer conns.Remove(item)
    name := fmt.Sprintf("user%d", id)
    SendMessage(nil, fmt.Sprintf("welcome %s joinn", name))
    r := bufio.NewReader(ws)
    for {
        data, err := r.ReadBytes('n')
        if err != nil {
            fmt.Printf("disconnected id: %dn", id)
            SendMessage(item, fmt.Sprintf("%s offlinen", name))
            break
        }
        fmt.Printf("%s: %s", name, data)
        SendMessage(item, fmt.Sprintf("%st> %s", name, data))
    }
}
func SendMessage(self *list.Element, data string) {
    // for _, item := range conns {
    for item := conns.Front(); item != nil; item = item.Next() {
        ws, ok := item.Value.(*websocket.Conn)
        if !ok {
            panic("item not *websocket.Conn")
        }
        if item == self {
            continue
        }
        io.WriteString(ws, data)
    }
}
// 网页客户端
func Client(w http.ResponseWriter, r *http.Request) {