go语言易于实现高并发,简易聊天室如下:

package mainimport ("fmt""net"
)/*
主go程:创建监听socket,for循环accept获取到客户端的conn,开启goroutine HandlerConnect
HandlerConnect:创建用户结构体,存入onlineMap,发送用户登录广播
Manager:监听全局的channel message,将读到的消息广播给onlineMap中的所有用户
WriteMsgToClient:读取每个用户自带channel C上消息,回写给用户
*/
// 创建用户结构体类型
type Client struct {C    chan stringName stringAddr string
}// 创建全局map,将用户存储到这里
var onlineMap map[string]Client// 创建全局channel穿递用户消息
var message = make(chan string)func WriteMsgToClient(clnt Client, conn net.Conn) {// 监听用户自带Channel上是否有消息for msg := range clnt.C {conn.Write([]byte(msg + "\n"))}
}func Manager() {// 初始化map,onlineMaponlineMap = make(map[string]Client)for { // 循环从message中读取是否有数据// 监听channel中是否有数据,有数据存储至message,无数据就阻塞msg := <-message// 循环发送消息给所有在线用户for _, clnt := range onlineMap {clnt.C <- msg}}}func MakeMsg(clnt Client, msg string) (buf string) {buf = "[" + clnt.Addr + "]" + clnt.Name + ":" + msgreturn
}func HandlerConnect(conn net.Conn) {defer conn.Close()// 获取用户网络地址netAddr := conn.RemoteAddr().String()// 创建新连接用户的结构体clnt := Client{make(chan string), netAddr, netAddr}// 将新连接用户添加到在线用户map中,key:IP+port value:clientonlineMap[netAddr] = clnt// 创建专门用来给当前用户发送消息的goroutinego WriteMsgToClient(clnt, conn)// 发送用户上线消息到全局通道中//message <- "[" + netAddr + "]" + clnt.Name + "login"message <- MakeMsg(clnt, "login")// 创建一个匿名goroutine,专门处理用户发送的消息go func() {buf := make([]byte, 4096)for {n, err := conn.Read(buf)if n == 0 {fmt.Printf("检测到客户端%s退出\n", clnt.Name)return}if err != nil {fmt.Println("conn Read err", err)return}// 将读到的用户消息保存到msg中,string类型msg := string(buf[:n])// 将读到的用户消息广播给所用在线用户(写入到message中)message <- MakeMsg(clnt, msg)}}()// 保证不退出for {}
}func main() {// 创建监听套接字listener, err := net.Listen("tcp", "127.0.0.1:9001")if err != nil {fmt.Println("Listen err", err)return}defer listener.Close()// 创建管理者go程go Manager()// 循环监听客户端请求for {conn, err := listener.Accept()if err != nil {fmt.Println("accept err", err)return}go HandlerConnect(conn)}
}

golang完成聊天室功能相关推荐

  1. python udp 直播_[Python] socket发送UDP广播实现聊天室功能

    原博文 2018-11-24 12:33 − 一.说明 本文主要使用socket.socket发送UDP广播来实现聊天室功能. 重点难点:理解UDP通讯流程.多线程.UDP广播收发等. 测试环境:Wi ...

  2. php 利用redis写一个聊天室,Redis实现多人多聊天室功能

    本文为大家分享了Redis支持多人多聊天室功能的设计代码,供大家参考,具体内容如下 设计原理 左边的一个数据域,代表两个聊天室,聊天室id分别是827,729 在聊天室827里,有2个人,分别是jas ...

  3. golang实现聊天室(五)

    golang实现聊天室(五) 完成服务端广播消息 server package mainimport ("fmt""log""math/rand&qu ...

  4. golang实现聊天室(四)

    golang实现聊天室(四) 服务端给已经建立连接的客户端发送消息 client1 func main() {var conn, err = net.DialTimeout("tcp&quo ...

  5. golang实现聊天室(三)

    golang实现聊天室(三) 实现多个客户端同时给服务端发送消息,服务端接受并打印出来 client1 func main() {var conn, err = net.DialTimeout(&qu ...

  6. golang实现聊天室(二)

    golang实现聊天室(二) 上一篇完成了服务端启动监听连接,客户端建立连接,发一个消息,断开连接.服务端收一下,然后服务端打印. 客户端可以一直发送消息,服务端不停接收并打印 client func ...

  7. java socket编程聊天室_Java Socket通信之聊天室功能

    Java Socket通信之聊天室功能 发布时间:2020-10-17 14:36:00 来源:脚本之家 阅读:73 作者:LY_624 本文实例为大家分享了Java Socket聊天室功能的具体代码 ...

  8. php 开发一个聊天系统,ajax+php 实现一个简单的在线聊天室功能(附带源码)

    通过ajax和setInterval()函数,配合php+mysql实现一个简单的在线聊天室的功能.附带详细源码案例.这个聊天室是一个简单的聊天室,通过javascript setInterval() ...

  9. APP开发者如何来实现视频聊天室功能

    这是一个新型的互联网业态,直播社交业务所带来的"钱景"正吸引越来越多的玩家进入这一行业.无论是专注秀场直播的YY,网易BoBo,还是提供手机直播的爆款应用Meerkat.在2015 ...

最新文章

  1. ssm 异常捕获 统一处理_SSM 统一异常处理
  2. sqlServer事务
  3. python代码变成运行程序_用Python脚本转换成windows的可执行程序
  4. [渝粤教育] 广东-国家-开放大学 21秋期末考试财务管理10164k2 (3)
  5. 如何自定义 maven中的archetype
  6. js中的cookie的读写操作
  7. Linux 命令(122)—— watch 命令
  8. mysql 大量close wait_线上大量CLOSE_WAIT原因排查
  9. Ubuntu文件目录结构详解
  10. 学习方法-北大学霸(02)初级技能
  11. 校园网客户端不识别网卡
  12. linux cpu 温度 代码,linux CPU温度
  13. Python案例实操3-电影数据分析
  14. 基于ssm的网上问卷调查系统的实现与设计
  15. 这几款app疫情期间活跃度为何如此高?方法太可了吧
  16. 【kettle】文件导入数据库乱码
  17. Nginx配之负载均衡、缓存、黑名单和灰度发布
  18. 018脑电图癫痫检测与预测算法综述(2014)
  19. 计算机软件应用职业规划,计算机软件专业的职业生涯规划
  20. React Native 中 TextInput 组件和中文输入冲突

热门文章

  1. Java黑皮书课后题第5章:*5.50(对大写字母计数)编写一个程序,提示用户输入一个字符串,然后显示该字符串中大写字母的数目
  2. vuejs之【router-link】大全(二)
  3. linux系统下开机启动流程
  4. Windows下SVN服务器的搭建步骤
  5. oc基础-foundation框架中的常用结构体
  6. JavaScript实现http地址自动检测并添加URL链接
  7. ResorceGovernor--基础和Demo
  8. 【数据结构与算法】之深入解析“最长有效括号”的求解思路与算法示例
  9. 【数据结构与算法】之深入解析“螺旋矩阵II”的求解思路与算法示例
  10. Git之深入解析如何将项目迁移到Git