国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

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

服務器之家 - 腳本之家 - Golang - GO使用socket和channel實現簡單控制臺聊天室

GO使用socket和channel實現簡單控制臺聊天室

2022-01-25 00:42謙虛的小學徒 Golang

今天小編給大家分享一個簡單的聊天室功能,聊天室主要功能是用戶可以加入離開聊天室,實現思路也很簡單明了,下面小編給大家帶來了完整代碼,感興趣的朋友跟隨小編一起看看吧

使用socket和channel,實現簡單控制臺聊天室

這里使用socket和channel,演示在GO中如何編寫一個簡單網絡程序

功能分析

聊天室主要功能:用戶可以加入/離開聊天室;每個用戶發送的消息,廣播給所有人
聊天室分為客戶端和服務端,客戶端負責發送消息和打印服務器消息,服務器負責接收客戶端消息,并廣播給所有人
客戶端可以使用telnet程序
服務端是需要實現的。需要實現的功能,

  1. 如何保存多個客戶端的連接,管理連接的接入與斷開
  2. 如何接收和廣播客戶端消息

實現思路

通過功能分析,拆分為聊天室結構體和客戶端結構體
聊天室結構體負責管理當前接入的客戶端和廣播消息
客戶端結構體負責管理socket連接和需要接收與發送的數據
客戶端連接/斷開時通知聊天室;客戶端發送的消息實際是轉發給聊天室,然后聊天室再廣播出去

完整代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package main
 
import (
    "bufio"
    "fmt"
    "log"
    "net"
)
 
type Client struct {
    id      string
    conn    *net.Conn
    message chan string
}
 
type Hub struct {
    clients  map[*Client]bool
    entering chan *Client
    leaving  chan *Client
    messages chan string
}
 
func main() {
    hub := &Hub{
        clients:  make(map[*Client]bool),
        entering: make(chan *Client),
        leaving:  make(chan *Client),
        messages: make(chan string),
    }
 
    listener, err := net.Listen("tcp", ":8000")
    if err != nil {
        log.Fatal(err)
    }
    go hub.broadcaster()
    for {
        conn, err := listener.Accept()
        if err != nil {
            log.Println(err)
            continue
        }
        go hub.handleConn(conn)
    }
}
 
func (hub *Hub) broadcaster() {
    for {
        select {
        case msg := <-hub.messages:
            for cli := range hub.clients {
                cli.message <- msg
            }
        case cli := <-hub.entering:
            hub.clients[cli] = true
        case cli := <-hub.leaving:
            delete(hub.clients, cli)
        }
    }
}
 
func (hub *Hub) handleConn(conn net.Conn) {
    defer conn.Close()
    ch := make(chan string)
    who := conn.RemoteAddr().String()
    client := &Client{who, &conn, ch}
 
    go hub.writeLoop(client)
    ch <- "welcome " + client.id
 
    hub.messages <- client.id + " join chat"
    hub.entering <- client
    hub.readLoop(client)
    hub.messages <- client.id + " has left"
    hub.leaving <- client
}
 
func (hub *Hub) writeLoop(client *Client) {
    for msg := range client.message {
        fmt.Fprintf(*client.conn, "%s\n", msg)
    }
}
 
func (hub *Hub) readLoop(client *Client) {
    input := bufio.NewScanner(*client.conn)
    for input.Scan() {
        hub.messages <- client.id + ": " + input.Text()
    }
}

分析

實現的關鍵是封裝了客戶端通信channel,無論是遠程發送過來的消息還是聊天室廣播的消息,都通過這個channel傳遞,且這個channel是綁定客戶端的
參考鏈接中,直接使用channel來定義客戶端type client chan<- string,其實更能表達這一點
為了容易理解,這里將channel封裝為客戶端的一個通信管道,客戶端還可以有別的屬性,例如:id、連接和超時時間等

參考: Go 網絡編程示例

到此這篇關于GO實現簡單控制臺聊天室的文章就介紹到這了,更多相關go控制臺聊天室內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/snowsteps/p/15711223.html

延伸 · 閱讀

精彩推薦
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

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

    天易獨尊11682021-06-09
  • Golanggolang 通過ssh代理連接mysql的操作

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

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

    a165861639710342021-03-08
  • Golanggo日志系統logrus顯示文件和行號的操作

    go日志系統logrus顯示文件和行號的操作

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

    SmallQinYan12302021-02-02
  • Golanggolang的httpserver優雅重啟方法詳解

    golang的httpserver優雅重啟方法詳解

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

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

    go語言制作端口掃描器

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

    腳本之家3642020-04-25
  • Golanggolang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

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

    李浩的life12792020-05-27
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

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

    Go語言中文網11352020-05-21
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

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

    4272021-11-24
主站蜘蛛池模板: 国产一区二区三区欧美 | 久久五月天婷婷 | 亚洲免费一区 | 在线观看视频91 | 国产精品久久久久久久久久久久久 | 精品久久久久久久久久久久久久久久久久 | 久久久国产一区 | 久久久久久久久国产 | 日韩三级高清 | 亚洲一区二区三区在线播放 | 国产一区二区久久 | 国产精品美女 | 九色在线| 91久久精品一区二区二区 | 欧美大片一区 | 免费黄色在线观看 | 国产无套丰满白嫩对白 | 91精品免费 | 久综合网 | 国产精品一区二区在线观看 | 欧美日韩第一页 | 成人精品久久久 | 九色视频网站 | av成人一区二区 | 动漫一区二区三区 | 国产小视频在线播放 | 看黄色片网站 | 亚洲精品乱码久久久久久久久 | 日日操天天爽 | 国产精品黄色 | 在线播放高清视频www | 国产视频第一页 | 亚洲国产精品一区二区第一页 | 精品网站www | 懂色一区二区三区av片 | 欧美日韩高清 | 国产精品区二区三区日本 | 三级成人在线 | 国产日韩久久 | 一区二区三区国产视频 | 亚洲精品字幕 |