欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室

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

使用socket和channel,實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室

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

功能分析

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

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

實(shí)現(xiàn)思路

通過功能分析,拆分為聊天室結(jié)構(gòu)體和客戶端結(jié)構(gòu)體
聊天室結(jié)構(gòu)體負(fù)責(zé)管理當(dāng)前接入的客戶端和廣播消息
客戶端結(jié)構(gòu)體負(fù)責(zé)管理socket連接和需要接收與發(fā)送的數(shù)據(jù)
客戶端連接/斷開時(shí)通知聊天室;客戶端發(fā)送的消息實(shí)際是轉(zhuǎn)發(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()
	}
}

分析

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

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

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

相關(guān)文章

  • 基于golang uint8、int8與byte的區(qū)別說明

    基于golang uint8、int8與byte的區(qū)別說明

    這篇文章主要介紹了基于golang uint8、int8與byte的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • windows下使用vscode搭建golang環(huán)境并調(diào)試的過程

    windows下使用vscode搭建golang環(huán)境并調(diào)試的過程

    這篇文章主要介紹了在windows下使用vscode搭建golang環(huán)境并進(jìn)行調(diào)試,主要包括安裝方法及環(huán)境變量配置技巧,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • golang數(shù)組內(nèi)存分配原理

    golang數(shù)組內(nèi)存分配原理

    這篇文章主要介紹了golang數(shù)組內(nèi)存分配原理,數(shù)組是內(nèi)存中一片連續(xù)的區(qū)域,在聲明時(shí)需要指定長(zhǎng)度,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,感興趣的小伙伴可以參考一下
    2022-06-06
  • Go語言基本的語法和內(nèi)置數(shù)據(jù)類型初探

    Go語言基本的語法和內(nèi)置數(shù)據(jù)類型初探

    這篇文章主要介紹了Go語言基本的語法和內(nèi)置數(shù)據(jù)類型,是golang入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • Go語言中如何確保Cookie數(shù)據(jù)的安全傳輸

    Go語言中如何確保Cookie數(shù)據(jù)的安全傳輸

    這篇文章主要介紹了Go語言中如何確保Cookie數(shù)據(jù)的安全傳輸,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • wind10 idea中 go 開發(fā)環(huán)境搭建教程圖解

    wind10 idea中 go 開發(fā)環(huán)境搭建教程圖解

    這篇文章主要介紹了wind10 idea中 go 開發(fā)環(huán)境搭建過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Go語言導(dǎo)出內(nèi)容到Excel的方法

    Go語言導(dǎo)出內(nèi)容到Excel的方法

    這篇文章主要介紹了Go語言導(dǎo)出內(nèi)容到Excel的方法,涉及Go語言操作excel的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Golang高效解析和生成XML的示例詳解

    Golang高效解析和生成XML的示例詳解

    這篇文章將從Golang中處理XML的基本概念開始,詳細(xì)介紹如何讀取和解析XML文件,然后轉(zhuǎn)向如何創(chuàng)建和輸出XML數(shù)據(jù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Golang自定義開發(fā)Prometheus?exporter詳解

    Golang自定義開發(fā)Prometheus?exporter詳解

    Exporter是基于Prometheus實(shí)施的監(jiān)控系統(tǒng)中重要的組成部分,承擔(dān)數(shù)據(jù)指標(biāo)的采集工作,這篇文章主要為大家介紹了如何自定義編寫開發(fā)?Prometheus?exporter,感興趣的可以了解一下
    2023-06-06
  • go常用指令之go?mod詳解

    go常用指令之go?mod詳解

    當(dāng)go命令運(yùn)行時(shí),它查找當(dāng)前目錄然后查找相繼的父目錄來找出 go.mod,下面這篇文章主要給大家介紹了關(guān)于go常用指令之go?mod的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08

最新評(píng)論