激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Golang - golang基于websocket實現(xiàn)的簡易聊天室程序

golang基于websocket實現(xiàn)的簡易聊天室程序

2020-04-30 11:45dotcoo Golang

這篇文章主要介紹了golang基于websocket實現(xiàn)的簡易聊天室,分析了websocket的下載、安裝及使用實現(xiàn)聊天室功能的相關(guān)技巧,需要的朋友可以參考下

本文實例講述了golang基于websocket實現(xiàn)的簡易聊天室。分享給大家供大家參考,具體如下:

先說點無關(guān)的,最近忙于工作沒有更新博客,今天休息順便把golang websocket研究了一下,挺好玩的,寫了一個聊天室,分享給大家.

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

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

首先安裝websocket包

復(fù)制代碼 代碼如下:
go get code.google.com/p/go.net/websocket

 

下來就是聊天室代碼了,呵呵

golang websocket 聊天室

復(fù)制代碼 代碼如下:
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)
    }
}
// 網(wǎng)頁客戶端
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="http://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 客戶端

復(fù)制代碼 代碼如下:
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)
    }
}

 

希望本文所述對大家Go語言程序設(shè)計有所幫助。

延伸 · 閱讀

精彩推薦
  • Golanggo日志系統(tǒng)logrus顯示文件和行號的操作

    go日志系統(tǒng)logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統(tǒng)logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang的httpserver優(yōu)雅重啟方法詳解

    golang的httpserver優(yōu)雅重啟方法詳解

    這篇文章主要給大家介紹了關(guān)于golang的httpserver優(yōu)雅重啟的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,...

    helight2992020-05-14
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggolang如何使用struct的tag屬性的詳細(xì)介紹

    golang如何使用struct的tag屬性的詳細(xì)介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細(xì)介紹,從例子說起,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網(wǎng)11352020-05-21
  • GolangGolang中Bit數(shù)組的實現(xiàn)方式

    Golang中Bit數(shù)組的實現(xiàn)方式

    這篇文章主要介紹了Golang中Bit數(shù)組的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
  • GolangGolang通脈之?dāng)?shù)據(jù)類型詳情

    Golang通脈之?dāng)?shù)據(jù)類型詳情

    這篇文章主要介紹了Golang通脈之?dāng)?shù)據(jù)類型,在編程語言中標(biāo)識符就是定義的具有某種意義的詞,比如變量名、常量名、函數(shù)名等等,Go語言中標(biāo)識符允許由...

    4272021-11-24
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggolang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
主站蜘蛛池模板: 干一夜综合 | 国产精品美女久久久久久不卡 | 加勒比综合| 国产精品成人久久久久a级 欧美特黄一级高清免费的香蕉 | 毛片视频免费播放 | 成年人观看免费视频 | 牛牛视频在线 | 久久精品1区2区 | 精品一区二区6 | 国产女同疯狂激烈互摸 | 久久av免费 | 久草在线精品观看 | 91精品一区二区综合在线 | 成人黄色小视频网站 | 99精品视频在线免费观看 | 嫩嫩的freehdxxx | 欧洲成人免费视频 | 男人久久天堂 | 国产男女 爽爽爽爽视频 | 性片久久 | 欧美日韩网站在线观看 | 91免费版在线 | 国产精品一区免费在线观看 | 毛片在线看免费 | 日韩视频高清 | 国产毛片毛片毛片 | 欧洲精品久久久久69精品 | 成人影片在线免费观看 | 羞羞的网址 | 久色乳综合思思在线视频 | 免费国产a | 亚洲一区二区中文 | 狠狠干91 | 九九热精品视频在线 | 日本一道aⅴ不卡免费播放 日日草夜夜操 | 最新一区二区三区 | 欧美成人免费在线视频 | 久产久精品 | 羞羞网站入口 | 日韩在线激情 | 精品国产一区二区三区在线观看 |