校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Golang實現的聊天程序服務端和客戶端代碼分享

Golang實現的聊天程序服務端和客戶端代碼分享

熱門標簽:外呼系統如何接收服務密碼 旅游廁所如何電子地圖標注 外呼系統多少錢一年 經常接到推銷電話機器人的電話 客服級電銷機器人 海外照相館地圖標注入駐 滁州自建外呼系統 工商信用卡外呼系統教程 智能營銷軟件

實現邏輯

1、Golang 版本  1.3

2、實現原理:

  1、主進程建立TCP監聽服務,并且初始化一個變量 talkChan := make(map[int]chan string)

  2、當主進程ACCEPT連接請求后,利用go 啟動一個協程A去維持和客戶端的連接,把taokChan帶入到協程里

  3、和客戶端建立連接的協程A,發送消息給客戶端,使其發送自己的用戶信息。

  4、協程A在收到客戶端發送的用戶信息后,建立一個此用戶對應的管道 talkChan[uid] = make(chan string)

  5、協程A再啟動一個協程A1去專門用來讀取客戶端發送的消息,并且用來判斷是發送給誰的消息,然后把消息放到對應的chan里。

  6、協程A再啟動一個協程A2用來讀取此用戶對應的管道,如果里面有信息,則取出來發送到客戶端。

實現代碼

服務端測試代碼:server.go

復制代碼 代碼如下:

package main

import (
    "fmt"
    "log"
    "net"
    "strconv"
)

func handleConnection(conn net.Conn, talkChan map[int]chan string) {
    //fmt.Printf("%p\n", talkChan)  //用以檢查是否是傳過來的指針

    /*
        定義當前用戶的uid
    */
    var curUid int

    var err error

    /*
        定義關閉通道
    */
    var closed = make(chan bool)

    defer func() {
        fmt.Println("defer do : conn closed")
        conn.Close()
        fmt.Printf("delete userid [%v] from talkChan", curUid)
        delete(talkChan, curUid)
    }()

    /**
     * 提示用戶設置自己的uid, 如果沒設置,則不朝下執行
     */
    for {
        //提示客戶端設置用戶id
        _, err = conn.Write([]byte("請設置用戶uid"))
        if err != nil {
            return
        }
        data := make([]byte, 1024)
        c, err := conn.Read(data)
        if err != nil {
            //closed - true  //這樣會阻塞 | 后面取closed的for循環,沒有執行到。
            return
        }
        sUid := string(data[0:c])

        //轉成int類型
        uid, _ := strconv.Atoi(sUid)
        if uid 1 {
            continue
        }
        curUid = uid
        talkChan[uid] = make(chan string)
        //fmt.Println(conn, "have set uid ", uid, "can talk")

        _, err = conn.Write([]byte("have set uid "+sUid+" can talk"))
        if err != nil {
            return
        }
        break
    }

    fmt.Println("err 3")

    //當前所有的連接
    fmt.Println(talkChan)

    //讀取客戶端傳過來的數據
    go func() {
        for {
            //不停的讀客戶端傳過來的數據
            data := make([]byte, 1024)
            c, err := conn.Read(data)
            if err != nil {
                fmt.Println("have no client write", err)
                closed - true //這里可以使用 | 因為是用用的go 新開的線程去處理的。 |  即便chan阻塞,后面的也會執行去讀 closed 這個chan
            }

            clientString := string(data[0:c])

            //將客戶端過來的數據,寫到相應的chan里
            if curUid == 3 {
                talkChan[4] - clientString
            } else {
                talkChan[3] - clientString
            }

        }
    }()

    /*
        從chan 里讀出給這個客戶端的數據 然后寫到該客戶端里
    */
    go func() {
        for {
            talkString := -talkChan[curUid]
            _, err = conn.Write([]byte(talkString))
            if err != nil {
                closed - true
            }
        }
    }()

    /*
       檢查是否已經關閉連接 如果關閉則推出該線程  去執行defer語句
    */
    for {
        if -closed {
            return
        }
    }
}

func main() {

    /**
    建立監聽鏈接
    */
    ln, err := net.Listen("tcp", "127.0.0.1:6010")
    if err != nil {
        panic(err)
    }

    //創建一個管道

    //talkChan := map[f]
    talkChan := make(map[int]chan string)

    fmt.Printf("%p\n", talkChan)

    /*
       監聽是否有客戶端過來的連接請求
    */
    for {
        fmt.Println("wait connect...")
        conn, err := ln.Accept()
        if err != nil {
            log.Fatal("get client connection error: ", err)
        }

        go handleConnection(conn, talkChan)
    }
}

客戶端測試代碼:client.go

復制代碼 代碼如下:

package main

import (
    "fmt"
    "math/rand"
    "net"
)

func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:6010")
    if err != nil {
        panic(err)
    }

    fmt.Fprintf(conn, "hello server\n")

    defer conn.Close()
    go writeFromServer(conn)

    for {
        var talkContent string
        fmt.Scanln(talkContent)

        if len(talkContent) > 0 {
            _, err = conn.Write([]byte(talkContent))
            if err != nil {
                fmt.Println("write to server error")
                return
            }
        }
    }
}

func connect() {
    conn, err := net.Dial("tcp", "127.0.0.1:6010")
    if err != nil {
        panic(err)
    }

    fmt.Fprintf(conn, "hello server\n")

    defer conn.Close()
    go writeFromServer(conn)

    for {
        var talkContent string
        fmt.Scanln(talkContent)

        if len(talkContent) > 0 {
            _, err = conn.Write([]byte(talkContent))
            if err != nil {
                fmt.Println("write to server error")
                return
            }
        }
    }
}

func writeFromServer(conn net.Conn) {
    defer conn.Close()
    for {
        data := make([]byte, 1024)
        c, err := conn.Read(data)
        if err != nil {
            fmt.Println("rand", rand.Intn(10), "have no server write", err)
            return
        }
        fmt.Println(string(data[0:c]) + "\n ")
    }
}

您可能感興趣的文章:
  • golang實現簡單的udp協議服務端與客戶端示例
  • 詳解golang consul-grpc 服務注冊與發現
  • 詳解如何熱重啟golang服務器
  • golang搭建靜態web服務器的實現方法
  • golang websocket 服務端的實現
  • 詳解prometheus監控golang服務實踐記錄

標簽:湘潭 本溪 楚雄 晉城 喀什 深圳 九江 運城

巨人網絡通訊聲明:本文標題《Golang實現的聊天程序服務端和客戶端代碼分享》,本文關鍵詞  Golang,實現,的,聊天,程序,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang實現的聊天程序服務端和客戶端代碼分享》相關的同類信息!
  • 本頁收集關于Golang實現的聊天程序服務端和客戶端代碼分享的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    麻豆国产欧美日韩综合精品二区 | 亚洲综合丝袜美腿| 7777精品伊人久久久大香线蕉| 成人免费三级在线| 久久精品久久久精品美女| 亚洲一区二区三区中文字幕| 精品久久一二三区| 91精品免费在线观看| 欧美色手机在线观看| 久久66热re国产| 日本不卡视频一二三区| 亚洲国产欧美另类丝袜| 亚洲欧美在线视频观看| 欧美日韩国产大片| 91色综合久久久久婷婷| 成人黄页毛片网站| 国产69精品一区二区亚洲孕妇| 毛片av一区二区| 免费看日韩a级影片| 日韩高清在线观看| 日韩高清不卡一区二区三区| 爽好多水快深点欧美视频| 国产精品激情偷乱一区二区∴| 久久在线观看免费| 日本一区二区动态图| 国产精品久久久久7777按摩| 亚洲精品国产一区二区精华液| 国产精品视频一区二区三区不卡| 国产欧美日韩久久| 亚洲天堂中文字幕| 最近中文字幕一区二区三区| 亚洲欧美国产77777| 亚洲综合区在线| 午夜久久久久久电影| 蜜乳av一区二区| 国产美女精品人人做人人爽| 粉嫩一区二区三区在线看| 色中色一区二区| 91偷拍与自偷拍精品| 欧美三区在线视频| 久久综合av免费| 亚洲精品综合在线| 五月婷婷综合在线| 成人一区二区在线观看| 在线观看一区二区精品视频| 日韩欧美久久久| 国产精品久久久久久久久搜平片 | 欧美性做爰猛烈叫床潮| 色狠狠综合天天综合综合| 日韩三级视频在线看| 日韩理论电影院| 秋霞电影网一区二区| 国产99久久久精品| 欧美精品一级二级三级| 中文在线资源观看网站视频免费不卡 | 18欧美亚洲精品| 国产精品高潮呻吟久久| 九色|91porny| 在线播放视频一区| 亚洲自拍偷拍九九九| av成人老司机| 国产精品美女久久久久久久| 国产毛片精品一区| 精品国产一区二区三区av性色| 日产欧产美韩系列久久99| 91激情五月电影| 亚洲视频一区二区在线| 成人动漫av在线| 国产午夜精品久久久久久久| 国产一区二区精品久久91| 欧美电影免费观看高清完整版在线| 午夜a成v人精品| 在线不卡欧美精品一区二区三区| 亚洲成人动漫一区| 欧美精品v国产精品v日韩精品| 亚洲国产精品影院| 精品视频一区三区九区| 午夜视频在线观看一区二区三区| 欧洲另类一二三四区| 亚洲自拍都市欧美小说| 欧美日韩国产中文| 日韩电影在线看| 26uuu另类欧美亚洲曰本| 国产精品一区二区你懂的| 日本一区二区免费在线| 成人激情黄色小说| 亚洲一区二区五区| 日韩欧美一二三四区| 国产在线国偷精品产拍免费yy| 久久久久久久网| 99国产一区二区三精品乱码| 亚洲成av人片一区二区| 日韩免费性生活视频播放| 国产成人精品免费网站| 亚洲精选视频在线| 日韩一二三四区| 成人午夜av在线| 亚洲福利视频一区二区| 精品少妇一区二区三区在线视频| 国产成人精品三级| 国产福利一区二区三区| 亚洲人成小说网站色在线| 99久久久无码国产精品| 一区二区三区 在线观看视频| 欧美乱妇20p| 国产激情91久久精品导航| 国产精品国产三级国产专播品爱网| 亚洲二区在线观看| 亚洲色欲色欲www在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 久久综合久久99| 日韩精品一区二区三区蜜臀 | 中文字幕一区视频| 日本一区二区在线不卡| 欧美国产一区二区| 国产精品久久久久久久久免费桃花 | 91福利在线看| 91国产免费看| 欧美性猛交xxxx乱大交退制版| 在线观看一区二区视频| 欧美日韩一级二级三级| 欧美男同性恋视频网站| 欧美精品久久久久久久久老牛影院| 欧美日韩成人高清| 9191国产精品| 欧美r级电影在线观看| 国产亚洲女人久久久久毛片| 国产精品久久久久久久久免费桃花 | 国精品**一区二区三区在线蜜桃| 久久97超碰国产精品超碰| 久久er99精品| 国产精品一区二区三区乱码| 99综合电影在线视频| 亚洲观看高清完整版在线观看 | 99久久99久久久精品齐齐| 成人在线一区二区三区| 一本色道久久综合精品竹菊| 欧美在线色视频| 欧美一区二区在线视频| 久久久www成人免费无遮挡大片| 中文字幕 久热精品 视频在线| 一区二区三区色| 美女www一区二区| 97国产一区二区| 日韩亚洲欧美在线观看| 国产精品天天看| 亚洲一区二区影院| 国产在线国偷精品产拍免费yy | 日韩欧美激情在线| 中文字幕av一区二区三区| 亚洲动漫第一页| 国产.欧美.日韩| 911精品国产一区二区在线| 国产欧美一二三区| 日产国产欧美视频一区精品| 国产凹凸在线观看一区二区 | 91在线观看免费视频| 欧美一区二区三区四区五区| 一区在线观看免费| 久久国产欧美日韩精品| 日本精品一区二区三区高清| 久久久久久久久蜜桃| 亚洲大型综合色站| av不卡在线观看| 日韩精品一区二区三区在线观看 | 国产精品青草综合久久久久99| 日韩av一区二区三区| 972aa.com艺术欧美| 久久久国产一区二区三区四区小说| 亚洲综合一区二区三区| 高清日韩电视剧大全免费| 日韩免费一区二区| 天天射综合影视| 在线亚洲精品福利网址导航| 国产日韩欧美精品电影三级在线| 免费欧美在线视频| 欧美系列一区二区| 国产精品久久精品日日| 国产一区二区三区美女| 正在播放一区二区| 一区二区三区国产精品| 91免费视频网址| 国产精品久久久久久久久久久免费看 | 欧美国产精品专区| 免费在线一区观看| 欧美福利一区二区| 亚洲一二三级电影| 日本高清不卡一区| 亚洲乱码国产乱码精品精可以看| 成人免费看片app下载| 国产婷婷色一区二区三区| 精品综合久久久久久8888| 日韩一区二区三区观看| 石原莉奈在线亚洲二区| 在线观看视频一区| 亚洲最大的成人av| 欧美网站大全在线观看| 亚洲小说欧美激情另类| 欧美日高清视频| 日本v片在线高清不卡在线观看|