• golang websocket 聊天室demo


    近期偶然的机会看到一些go的websocket技术方案,顺便写了个demo,玩了一下:

    首先安装websocket包

    go get code.google.com/p/go.net/websocket

     

    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: %d\n", id)

        

        item := conns.PushBack(ws)

        defer conns.Remove(item)

        

        name := fmt.Sprintf("user%d", id)

        

        SendMessage(nil, fmt.Sprintf("welcome %s join\n", name))

        

        r := bufio.NewReader(ws)

        

        for {

            data, err := r.ReadBytes('\n')

            if err != nil {

                fmt.Printf("disconnected id: %d\n", id)

                SendMessage(item, fmt.Sprintf("%s offline\n", name))

                break

            }

        

            fmt.Printf("%s: %s", name, data)

        

            SendMessage(item, fmt.Sprintf("%s\t> %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) {

        html := `<!doctype html>

    <html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <title>golang websocket chatroom</title>

        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

        <script>

            var ws = new WebSocket("ws://127.0.0.1:6611/chatroom");

            ws.onopen = function(e){

                console.log("onopen");

                console.dir(e);

            };

            ws.onmessage = function(e){

                console.log("onmessage");

                console.dir(e);

                $('#log').append('<p>'+e.data+'<p>');

                $('#log').get(0).scrollTop = $('#log').get(0).scrollHeight;

            };

            ws.onclose = function(e){

                console.log("onclose");

                console.dir(e);

            };

            ws.onerror = function(e){

                console.log("onerror");

                console.dir(e);

            };

            $(function(){

                $('#msgform').submit(function(){

                    ws.send($('#msg').val()+"\n");

                    $('#log').append('<p style="color:red;">My > '+$('#msg').val()+'<p>');

                    $('#log').get(0).scrollTop = $('#log').get(0).scrollHeight;

                    $('#msg').val('');

                    return false;

                });

            });

        </script>

    </head>

    <body>

        <div id="log" style="height: 300px;overflow-y: scroll;border: 1px solid #CCC;">

        </div>

        <div>

            <form id="msgform">

                <input type="text" id="msg" size="60" />

            </form>

        </div>

    </body>

    </html>`

        io.WriteString(w, html)

    }

        

    func main() {

        fmt.Printf(`Welcome chatroom server!

    author: dotcoo zhao

    url: http://www.dotcoo.com/golang-websocket-chatroom

        

    `)

        

        connid = 0

        conns = list.New()

        

        http.Handle("/chatroom", websocket.Handler(ChatroomServer));

        http.HandleFunc("/", Client);

        err := http.ListenAndServe(":6611", nil);

        if err != nil {

            panic("ListenAndServe: " + err.Error())

        }

    }

    简陋了些,但是基本功能都有了.

    golang websocket 客户端

    package main

            

    import (

        "fmt"

        "bufio"

        "io"

        "os"

        "code.google.com/p/go.net/websocket"

    )

            

    func Command(ws *websocket.Conn) {

        r := bufio.NewReader(os.Stdin)

        w := bufio.NewWriter(ws)

            

        for {

            data, err := r.ReadBytes('\n')

            if err != nil {

                panic(err)

            }

            

            _, err = w.Write(data)

            if err != nil {

                panic(err)

            }

            w.Flush()

            

            fmt.Printf("My\t> ")

        }

    }

            

    func main() {

        fmt.Printf(`Welcome chatroom!

    author: dotcoo zhao

    url: http://www.dotcoo.com/golang-websocket-chatroom

            

    `)

                

        origin := "http://127.0.0.1:6611/"      

        url := "ws://127.0.0.1:6611/chatroom"

            

        ws, err := websocket.Dial(url, "", origin)

        if err != nil {

            panic(err)

        }

        defer ws.Close()

            

        r := bufio.NewReader(ws)

        //w := bufio.NewWriter(os.Stdout)

            

        go Command(ws)

            

        for {

            data, err := r.ReadBytes('\n')

            if err == io.EOF {

                fmt.Printf("disconnected\n")

                os.Exit(0)

            }

            if err != nil {

                panic(err)

            }

            

            fmt.Printf("\r%sMy\t> ", data)

        }

    }

     

    总体下来还是挺简单的,效果还不错。大家可以试试看。呵呵

  • 相关阅读:
    JSP第七次作业
    JSP第六次作业
    Jsp第五次作业
    软件测试第二次作业
    Jsp第四次作业2
    Jsp第四次作业1
    软件测试第一次作业
    JSP第三次作业
    JSP第二次作业
    第七次作业
  • 原文地址:https://www.cnblogs.com/bozhang/p/3115296.html
Copyright © 2020-2023  润新知