zoukankan      html  css  js  c++  java
  • golang 聊天室

    近期看了一些关于golang的资料。发现它的WEBSOCKT实现真起来真的非常easy。以下是代码

    go.net/websocket是须要安装的,这个自己装上即可

    package main
    
    
    import (
        "container/list"
        "fmt"
        "go.net/websocket"
        "io"
        "net/http"
    )
    
    
    var connid int
    var conns *list.List
    
    
    func Chat(ws *websocket.Conn) {
        defer ws.Close()
        item := conns.PushBack(ws)
        defer conns.Remove(item)
    
    
        var err error
        for {
            var data string
            if err = websocket.Message.Receive(ws, &data); err != nil {
                fmt.Printf("disconnected
    ")
                break
            }
    
    
            SendMessage(item, fmt.Sprintf("%s", 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)
        }
    }
    
    
    // client默认显示页面
    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 language="javascript"type="text/javascript">  
            var sock=null; 
            var wsuri ="ws://192.168.1.163:7878/chat"; //这里的IP假设是局域測试的话。须要换成自己的
            window.onload = function(){
                console.log("onload");
                sock = new WebSocket(wsuri);
                sock.onopen=function(e){
                    console.log("connected to "+wsuri);
                }
                sock.onclose=function(e){
                    console.log("connection closed (" + e.code + ")");
                }
                sock.onmessage=function(e){
                    console.log("message received: " + e.data);
                    document.getElementById("list").innerHTML += e.data;
                    var div = document.getElementById("list")
                    div.scrollTop = div.scrollHeight; 
                }
            }
            function send () {
                var who = document.getElementById('who').value;
                if (who.length == 0){
                    document.getElementById('who').focus();
                    return
                }
                var msg = document.getElementById('msg').value;
                if (msg.length == 0){
                    document.getElementById('msg').focus();
                    return
                }
                var data = who + "  say:  " + msg + "<br/><br/>";
                document.getElementById('msg').value="";
                document.getElementById('who').value="";
                var div = document.getElementById("list")
                div.innerHTML += data;
                div.scrollTop = div.scrollHeight; 
                sock.send(data);
            }        
        </script>
    </head>
    <body>
        <div id="list" style="height: 300px;overflow-y: scroll;border: 1px solid #CCC;">
        </div>
        <div>
            who are you 
            <input type="text" id="who" size="60" />
            your message
            <input type="text" id="msg" size="60" />
    
    
            <button onclick="send()">send</button>
        </div>
    </body>
    </html>`
        io.WriteString(w, html)
    }
    
    
    func main() {
        conns = list.New()
    
    
        http.Handle("/chat", websocket.Handler(Chat))
        http.HandleFunc("/", Client)
        err := http.ListenAndServe(":7878", nil)
        if err != nil {
            panic("ListenAndServe: " + err.Error())
        }
    }
    
    

  • 相关阅读:
    关于排序算法的记录
    java获取src下文件
    学习HashMap的笔记
    红黑树删除
    学习红黑树过程中的个人总结
    关于二叉树的记录
    关于自动装箱和自动拆箱
    学习函数的时候问题
    Oracle 实现拆分列数据的split()方法
    福大软工 · 最终作业
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7283156.html
Copyright © 2011-2022 走看看