因為沒有寫客戶端、可以在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...