最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GO使用socket和channel實現(xiàn)簡單控制臺聊天室

 更新時間:2021年12月20日 16:00:45   作者:謙虛的小學徒  
今天小編給大家分享一個簡單的聊天室功能,聊天室主要功能是用戶可以加入離開聊天室,實現(xiàn)思路也很簡單明了,下面小編給大家?guī)砹送暾a,感興趣的朋友跟隨小編一起看看吧

使用socket和channel,實現(xiàn)簡單控制臺聊天室

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

功能分析

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

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

實現(xiàn)思路

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

完整代碼

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()
	}
}

分析

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

參考: Go 網(wǎng)絡編程示例

到此這篇關于GO實現(xiàn)簡單控制臺聊天室的文章就介紹到這了,更多相關go控制臺聊天室內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一文帶你了解Go語言實現(xiàn)的并發(fā)神庫conc

    一文帶你了解Go語言實現(xiàn)的并發(fā)神庫conc

    前幾天逛github發(fā)現(xiàn)了一個有趣的并發(fā)庫-conc,這篇文章將為大家詳細介紹一下這個庫的實現(xiàn),文中的示例代碼講解詳細,感興趣的可以了解一下
    2023-01-01
  • 從生成CRD到編寫自定義控制器教程示例

    從生成CRD到編寫自定義控制器教程示例

    這篇文章主要為大家介紹了從生成CRD到編寫自定義控制器的教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 詳解Go?中的時間處理

    詳解Go?中的時間處理

    這篇文章主要介紹了Go?中的時間處理,本文將介紹?time?庫中一些重要的函數(shù)和方法,希望能幫助到那些一遇到?Go?時間處理問題就需要百度的童鞋,需要的朋友可以參考下
    2022-07-07
  • 簡單四步快速集成go環(huán)境變量

    簡單四步快速集成go環(huán)境變量

    這篇文章主要為大家介紹了快速集成go環(huán)境變量的簡單四個步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • go?mode?tidy出現(xiàn)報錯go:?warning:?“all“?matched?no?packages的解決方法

    go?mode?tidy出現(xiàn)報錯go:?warning:?“all“?matched?no?package

    使用go的時候我們一般都會使用go?mode管理,下面這篇文章主要給大家介紹了關于go?mode?tidy出現(xiàn)報錯go:?warning:?“all“?matched?no?packages的解決方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • go實現(xiàn)自動復制U盤小工具demo

    go實現(xiàn)自動復制U盤小工具demo

    這篇文章主要為大家介紹了go實現(xiàn)自動復制U盤小工具demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Golang?RPC的原理與簡單調用詳解

    Golang?RPC的原理與簡單調用詳解

    RPC(Remote?Procedure?Call),主要是幫助我們屏蔽網(wǎng)絡編程細節(jié)?,使我們更專注于業(yè)務邏輯,所以本文主要來和大家聊聊RPC的原理與簡單調用,希望對大家有所幫助
    2023-05-05
  • Go語言fmt模塊的完整方法詳解及示例代碼

    Go語言fmt模塊的完整方法詳解及示例代碼

    這篇文章主要介紹了Go語言fmt模塊使用的相關資料,fmt庫最基本的功能之一就是格式化輸出,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • golang?gorm的Callbacks事務回滾對象操作示例

    golang?gorm的Callbacks事務回滾對象操作示例

    這篇文章主要為大家介紹了golang?gorm的Callbacks事務回滾對象操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Go中的字典Map增刪改查、排序及其值類型

    Go中的字典Map增刪改查、排序及其值類型

    本文詳細介紹了Go語言中Map的基本概念、聲明初始化、增刪改查操作、反轉、排序以及如何判斷鍵是否存在等操作,Map是一種基于鍵值對的無序數(shù)據(jù)結構,鍵必須是支持相等運算符的類型,值可以是任意類型,初始化Map時推薦指定容量以提高性能
    2024-09-09

最新評論

讷河市| 蓬溪县| 呈贡县| 庐江县| 永和县| 炎陵县| 张家港市| 松滋市| 乌审旗| 霸州市| 巢湖市| 汤阴县| 科技| 商河县| 新干县| 宜丰县| 桃园县| 大丰市| 平遥县| 湛江市| 宁津县| 建昌县| 开封市| 米脂县| 扬州市| 大竹县| 拉萨市| 乌兰浩特市| 团风县| 忻城县| 米泉市| 民和| 正宁县| 定边县| 彝良县| 新源县| 沁水县| 沾化县| 丰县| 通海县| 买车|