golang 聊天室學習筆記

2021-09-27 05:10:12 字數 2476 閱讀 3180

1聊天室伺服器端

package main

import (

"fmt"

"net"

"strings"

"time"

)//定義的此結構體為全域性map的value值,包括每乙個使用者的姓名,ip位址和私人管道

type client struct 

/*這個函式是將私人管道中的內容傳送給使用者,配合全域性管道message使用可以實現廣播的功能,

單獨使用可以實現私聊的功能*/

func writemsg2client(clinet client, conn net.conn) 

}//這只是乙個封裝好用來統一(傳送資訊格式)的小函式,不用在意

func makemsg(name string, addr string, s string) string 

//每乙個進入聊天室的使用者都將啟動乙個handleconn的go程來處理事件

func handleconn(conn net.conn) 

//在這裡啟動子go程,功能上面已經提及,具體就是會寫資訊給自己連線的客戶端

go writemsg2client(client, conn)

onlinemap[addr] = client

//登入進來一切準備就緒後就給所有人廣播上線資訊啦

message <- makemsg(client.name, addr, "login")

//下面這三個變數服務於下面一些小功能

var haschat = make(chan bool)

var ifquit = make(chan bool)

var flag bool

//從這單獨開啟乙個go程來讀取使用者輸入的資訊

go func() 

//改名功能的實現

if string(buf[:7]) == "rename|"  else if string(buf[:n-1]) == "/who" 

} else if string(buf[:2]) == "m|" && strings.count(string(buf[:n]), "|") == 2 

}if flag 

} else 

haschat <- true

}}()

for 

}}//這個函式用來將全域性message中的內容全部塞到私人管道c裡,實現上下線廣播和群聊的功能

func manager() 

}}var message = make(chan string)

var onlinemap map[string]client = make(map[string]client)

//主函式

func main() 

//每乙個連線進來的使用者都會被分配進入乙個子go程,用來處理上面我們提到的各種功能

go handleconn(conn)

}}/*備註

1、  listener, _ := net.listen("tcp", "127.0.0.1:9876")

監聽啟動

2、  go manager()開啟全域性message的go程,防止被阻塞,沒有訊息便被阻塞,有訊息便會被喚起,

訊息傳送完畢後重新等待訊息,有訊息變傳送沒訊息便阻塞等待(message 是乙個字串channel )。

func manager() 

}}3、私人通道訊息處理

這個函式是將私人管道中的內容傳送給使用者,配合全域性管道message使用可以實現廣播的功能。

單獨使用可以實現私聊的功能(m|客戶端連線ip加埠|傳送訊息)(m|127.0.0.1:59700|hello)。

這個函式也是等待訊息,收到訊息後被喚醒執行,訊息執行完畢後等待新訊息,沒有阻塞,有就處理

func writemsg2client(clinet client, conn net.conn) 

}*/

2、聊天室客戶端

package main

import (

"bufio"

"fmt"

"net"

"os"

"strings"

)func readfromserver(conn net.conn) 

defer conn.close()

fmt.println("接收到訊息:", string(buf[:n]))

fmt.println("請輸入要傳送的訊息:")

}}func main() 

defer conn.close()

go readfromserver(conn)

"請輸入要傳送的訊息:")

for 

str = strings.trimspace(str)

"傳送前", , "展示")

"a", str, "b")

if str == "q" 

conn.write(byte(str))

}}

asp 學習聊天室

了解了整個程式的核心部分,下面考慮如何儲存客戶資訊,這裡要用到乙個會話級的變數,即將客戶的nick儲存到session中,如 session nick request.form nick 最後我們要考慮的如何在asp檔案中處理多種事件 如客戶登陸介面,客戶聊天介面 由於客戶第一次請求.asp檔案時,...

mysql 聊天室 聊天室php mysql 六

聊天室php mysql 六 相應的 資料庫 phpmyadmin mysql dump 主機 localhost 3306 資料庫 study28 資料表的結構 chat user create table chat user userid varchar 20 not null,passwd v...

golang 實現乙個聊天室

最近看了一下go語言,就試著寫了乙個聊天室,練練手而已,但是對於我乙個搞php的來說,go語言對我啟發很大。客服端 package main import fmt net os 定義通道 var ch chan int make chan int 定義暱稱 var nickname string f...