• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

go聊天室

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
package main

import (
"fmt"
"net"
"sync"
)

var mux sync.RWMutex
var onlineUser = make(map[string]net.Conn)
var messageChan = make(chan string)

func main() {
listen, err := net.Listen("tcp", "127.0.0.1:8888")
if err != nil {
fmt.Printf("listen error %s\n", err)
}

defer listen.Close()

go listenBroadMessage()

for {
conn, err := listen.Accept()
if err != nil {
fmt.Printf("conn error %s \n", err)
}

go handlerConn(conn)

}
}

// listen broad message and send to all user
func listenBroadMessage() {
for {
msg := <-messageChan
fmt.Println("收到消息:" + msg)
for _, conn := range onlineUser {
conn.Write([]byte(msg))
}
}
}

//broadcast message
func broadMessage(conn net.Conn, message string) {
messageChan <- generateMessage(conn, message)
}


func generateMessage(conn net.Conn, msg string) string {
return "[" + conn.RemoteAddr().String() + "]" + " " + msg + "\n"
}

// handler each user
func handlerConn(conn net.Conn) {
addr := conn.RemoteAddr().String()
broadMessage(conn, "进入了房间")

mux.Lock()
onlineUser[addr] = conn
mux.Unlock()

var isQuit = make(chan bool)
go func() {
buff := make([]byte, 4098)
for {
n, _ := conn.Read(buff)
if n == 0 {
isQuit <- true
return
}
buffMsg := string(buff[:n-1])
if buffMsg != "" {
broadMessage(conn, buffMsg)
}
}

}()

for {
select {
case <-isQuit:
delete(onlineUser, addr)
broadMessage(conn, "离开了房间")
return
}
}
}

  

 

 

https://blog.csdn.net/weixin_42940826/article/details/82386275

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go语言标准库发布时间:2022-07-10
下一篇:
go channel发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap