GO 小白之併發聊天室

2021-09-20 02:19:21 字數 2151 閱讀 1231

因為沒有寫客戶端、可以在cmd中利用  nc -u 來充當客戶端

廣播使用者上線:

1、主go程中建立socket、defer

2、迴圈監聽客戶端連線請求

3、有乙個客戶端鏈結、建立新go程處理客戶資料

4、組織使用者相關資訊、全域性變數(結構體、map、channel)

5、hadlconn、初始化新使用者結構體資訊、獲取客戶端ip和port、初始化新使用者結構體資訊、 name==addr

7、新使用者新增到map中、key==ip+port  value==結構體

8、建立writetoclient go程專門給當前使用者傳送訊息、遍歷自帶c、讀資料、conn.write寫到客戶端

9、hadlconn中。結束位置、組織使用者上線資訊、將使用者上線資訊寫到全域性channel--maneger被激 活 

10、hadlconn結尾處要有for迴圈、不然直接終止

有問題的地方都已經注釋

接下來要在基礎框架上增加小功能

傳送訊息內容:

1、封裝函式來廣播使用者傳的訊息,傳到massage中

2、起匿名go程、主要是來讀取客戶端傳送的內容、寫到全域性massage中

3、for 迴圈讀取客戶端傳送的內容

4、寫給全域性massage

將buf裡減去乙個「\n」

判斷是否為who,如果為who、遍歷map ,將名字利用conn.write寫到當前客戶端

修改使用者名稱:

1、將讀取到的masg進行判斷是否為rename

2、提取rename| 後的字串、存入到client.name成員中

4、提示使用者更新成功

使用者退出:

1、在使用者登入成功後、建立監聽使用者退出的channel---isquit

2、當conn.read==0時、isquit

3、在handleconnect結尾for中、新增select監聽

超時強踢:

2、判斷使用者是否活躍,建立監聽活躍的channel、只要使用者執行聊天改名查詢任意操作,向此channel                             寫資料

3、在select新增使用者活躍度的監聽、條件滿足、不作為,目的是重置上面建立的計時器

這些功能其實都是在handleconn函式中實現的

func handleconn(connnet.conn)

olinemap[addr]=client

msg:=mkmas(client,"login")

//將訊息傳到全域性通道傳送給其他人

gowritetoclient(client,conn)

massage

quit:=make(chanbool)

datahas:=make(chanbool)

//匿名函式主要做的是客戶端寫入的資料

buf:=make(byte,1024)

go func() else iflen(msg)>=8&&msg[:6]=="rename"else{

info:=mkmas(client,msg)

massage

datahas

//注意位置、如果客戶端改名、who命令都算活躍

for{

select{

case

close(client.c)        //關閉writetoclient函式

delete(olinemap,addr)

str:=mkmas(client,"exit")

fmt.println(str,"exit")

massage

return                //return當前go程返回、但是中間建立的go程不會停止。所以要將writetoclient關閉

case

case

delete(olinemap,addr)

str:=mkmas(client,"timeout")

massage

fmt.println(str,"timeout")

return

用go實現併發聊天室

還是老一套,go在網路模組的開發確實是便捷無比,使用goroutine的特性簡直是如魚得水,準備簡單的使用go做乙個cs的聊天室,整體 不到一千行,核心 可能就一兩百行,非常通俗易懂,能幫助我們學習goroutine的特性和感受tcp。源 效果圖 服務端 客戶端jack 客戶端pony 一 服務端 ...

go 簡單聊天室

package main import fmt net strings time 建立使用者結構體型別 type cline struct var onlinemap map string cline 建立全域性 channel 傳遞使用者訊息 var message make chan strin...

C Socket聊天室(小白整理)

最近算是0基礎學了socket的程式設計,發現很多不友好。其實是自己不知道,啊哈哈。最開始建立c 的指令碼時要建立窗體,而不是控制台程式。之後建議根據介面,自己來寫。還有別忘了server和client建立兩個程式哦。分別為服務端,客戶端。正式的socket服務端 public partial cl...