日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang简易版聊天室

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang简易版聊天室 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

功能需求:

創建一個聊天室,實現群聊和單聊的功能,直接輸入為群聊,@某人后輸入為單聊

效果圖:

群聊:

?

單聊:

?

服務端:

package mainimport ("fmt""net""strings" )type info struct {conn net.Connname string }var ch_all chan string = make(chan string) var ch_one chan string = make(chan string) var ch_who chan string = make(chan string) var infos map[string]info = make(map[string]info)func handle(conn net.Conn) {defer conn.Close()buf := make([]byte, 100)n, _ := conn.Read(buf)name := string(buf[:n])var oneinfo infooneinfo.conn = connoneinfo.name = nameaddr := conn.RemoteAddr().String()infos[addr] = oneinfomsg := name + "進入聊天室"ch_all <- msgfor {n, _ := conn.Read(buf)if n == 0 {fmt.Printf("%s斷開連接\n", addr)msg = name + "離開聊天室"delete(infos, addr)ch_all <- msgfmt.Println(msg)return}if string(buf[:n])[0] == '@' {sli := strings.Fields(string(buf[1:n])) //隔開who := sli[0]msg = strings.Join(sli[1:], "") //后邊的再拼接回去ch_who <- whoch_one <- name + "->me : " + msg //單發continue}ch_all <- name + "->all : " + string(buf[:n]) //群發} }func sendone() {for {who := <-ch_whomsg := <-ch_onefor _, v := range infos {if v.name == who {v.conn.Write([]byte(msg))break}}} } func sendall() {for {msg := <-ch_allfor _, val := range infos {val.conn.Write([]byte(msg))}} } func main() {listener, _ := net.Listen("tcp", ":9009")defer listener.Close()go sendall()go sendone()for {conn, _ := listener.Accept()fmt.Printf("%s建立連接\n", conn.RemoteAddr().String())go handle(conn)} }

客戶端:

package mainimport ("bufio""fmt""net""os" )func scandata(conn net.Conn) {for {//設置可以讀取帶空格的myscanmyscan := bufio.NewReader(os.Stdin)buf, _, _ := myscan.ReadLine()if string(buf) == "q" {os.Exit(0)}conn.Write(buf)} } func main() {conn, _ := net.Dial("tcp", "127.0.0.1:9009")buf := make([]byte, 1024)args := os.Argsconn.Write([]byte(args[1]))go scandata(conn)for {n, _ := conn.Read(buf)fmt.Println(string(buf[:n]))} }

總結

以上是生活随笔為你收集整理的golang简易版聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。