亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言實現一個簡單的并發(fā)聊天室的項目實戰(zhàn)

 更新時間:2022年03月18日 16:06:24   作者:Sirius_7  
本文主要介紹了Go語言實現一個簡單的并發(fā)聊天室的項目實戰(zhàn),文中根據實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下

寫在前面

Go語言在很多方面天然的具備很多便捷性,譬如網絡編程,并發(fā)編程。而通道則又是Go語言實現并發(fā)編程的重要工具,因為其承擔著通道之間互相通信的重任。并且因為其本身就是并發(fā)安全的,所以在某些場景下是非常好用的。

并發(fā)聊天服務器

這里主要是實現一個簡單的并發(fā)聊天服務器。首先,客戶端可以在服務器中注冊自己的信息(登錄以及退出),客戶端發(fā)出的所有的信息由服務器向各個客戶端進行轉發(fā),或者換句話說是廣播。

具體代碼

服務端

說的再多,沒有代碼簡單明了,直接上代碼~

package main

import (
?? ?"bufio"
?? ?"fmt"
?? ?"log"
?? ?"net"
)
type client chan <- string //定義一個單向的向外發(fā)送數據的通道

var (
?? ?entering = make(chan client)
?? ?leaving = make(chan client)
?? ?messages = make(chan string)
)

func main() {
?? ?listener, err := net.Listen("tcp","localhost:8000")
?? ?if err != nil {
?? ??? ?log.Fatal("network is broken", err)
?? ?}
?? ?go broadcaster()
?? ?for {
?? ??? ?conn, err := listener.Accept()
?? ??? ?if err != nil {
?? ??? ??? ?log.Print(err)
?? ??? ??? ?continue
?? ??? ?}
?? ??? ?go handleConn1(conn)
?? ?}
}
func broadcaster() ?{
?? ?clients := make(map[client]bool) //存儲每個client的登錄狀態(tài)
?? ?for{
?? ??? ?select {
?? ??? ?case msg := <-messages:
?? ??? ??? ?for cli := range clients {
?? ??? ??? ??? ?cli <- msg
?? ??? ??? ?}
?? ??? ?case cli := <-entering:
?? ??? ??? ?clients[cli] = true
?? ??? ?case cli := <-leaving:
?? ??? ??? ?delete(clients,cli)
?? ??? ??? ?close(cli)
?? ??? ?}
?? ?}
}

func handleConn1(conn net.Conn) ?{
?? ?ch := make(chan string)
?? ?go clientWriter(conn, ch)
?? ?who := conn.RemoteAddr().String()
?? ?ch <- "You are " + who
?? ?entering <- ch
?? ?messages <- who + "has arrived"

?? ?input := bufio.NewScanner(conn)
?? ?for input.Scan() {
?? ??? ?messages <- who + ":" + input.Text()
?? ?}

?? ?leaving <- ch
?? ?messages <- who + "has left"
?? ?conn.Close()
}

func clientWriter(conn net.Conn, ch <- chan string) ?{
?? ?for msg := range ch {
?? ??? ?fmt.Fprintln(conn, msg)
?? ?}
}

客戶端

客戶端相對簡單,只是涉及到信息的發(fā)送和接受工作。

package main

import (
?? ?"io"
?? ?"log"
?? ?"net"
?? ?"os"
)

func main() {
?? ?conn, err := net.Dial("tcp","localhost:8000")
?? ?if err != nil {
?? ??? ?log.Fatal("Connected has been refused!",err)
?? ?}
?? ?defer conn.Close()
?? ?go mesCopy(os.Stdout,conn)
?? ?mesCopy(conn,os.Stdin)
}

func mesCopy(des io.Writer, res io.Reader) ?{
?? ?if _, err := io.Copy(des, res); err != nil {
?? ??? ?log.Print("wrong!")
?? ?}
}

 總結

實現原理較為簡單,所以代碼并沒有多少注釋,如果有任何疑問,歡迎留言討論。最后說一句,在MIT的課程中,其實并不是很推薦在并發(fā)編程中使用通道chan,除非你對其應用的場景和可能出現的情況有很好的把握,不然可能會出現很多不可預測的事情,譬如死鎖(見另外一篇博客)。在這種時候,共享變量將會是一種很好的選擇,具體查看go多線程實踐。

到此這篇關于Go語言實現一個簡單的并發(fā)聊天室的項目實戰(zhàn)的文章就介紹到這了,更多相關Go語言 并發(fā)聊天室內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • golang進行簡單權限認證的實現

    golang進行簡單權限認證的實現

    本文主要介紹了golang簡單權限認證的實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Golang Cron 定時任務的實現示例

    Golang Cron 定時任務的實現示例

    這篇文章主要介紹了Golang Cron 定時任務的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Go語言調用其它程序并獲得程序輸出的方法

    Go語言調用其它程序并獲得程序輸出的方法

    這篇文章主要介紹了Go語言調用其它程序并獲得程序輸出的方法,實例分析了Go調用cmd程序的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Golang中數據結構Queue的實現方法詳解

    Golang中數據結構Queue的實現方法詳解

    這篇文章主要給大家介紹了關于Golang中數據結構Queue的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • 使用golang在windows上設置全局快捷鍵的操作

    使用golang在windows上設置全局快捷鍵的操作

    最近在工作中,總是重復的做事,想著自己設置一個快捷鍵實現windows 剪貼板的功能,所以本文小編給大家分享了使用golang在windows上設置全局快捷鍵的操作,文中有相關的代碼示例供大家參考,需要的朋友可以參考下
    2024-02-02
  • Golang二進制文件混淆保護操作

    Golang二進制文件混淆保護操作

    這篇文章主要介紹了Golang二進制文件混淆保護操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言中定時任務庫Cron使用方法介紹

    Go語言中定時任務庫Cron使用方法介紹

    cron的意思計劃任務,說白了就是定時任務。我和系統(tǒng)約個時間,你在幾點幾分幾秒或者每隔幾分鐘跑一個任務(job),今天通過本文給大家介紹下Go語言中定時任務庫Cron使用方法,感興趣的朋友一起看看吧
    2022-03-03
  • 學習使用Go反射的用法示例

    學習使用Go反射的用法示例

    這篇文章主要介紹了學習使用Go反射的用法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • 使用Go語言解決Scan空格結束輸入問題

    使用Go語言解決Scan空格結束輸入問題

    這篇文章主要為大家介紹了使用Go語言來解決Scan空格結束輸入問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • Golang 按行讀取文件的三種方法小結

    Golang 按行讀取文件的三種方法小結

    本文主要介紹了Golang 按行讀取文件的三種方法小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04

最新評論