iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >go语言如何实现即时通讯聊天室
  • 231
分享到

go语言如何实现即时通讯聊天室

2023-06-30 13:06:08 231人浏览 薄情痞子
摘要

本文小编为大家详细介绍“Go语言如何实现即时通讯聊天室”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言如何实现即时通讯聊天室”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实现的功能:公聊,私聊,修改用户名

本文小编为大家详细介绍“Go语言如何实现即时通讯聊天室”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言如何实现即时通讯聊天室”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

实现的功能:公聊,私聊,修改用户名

只用到了四个类:

  • main.go:用来启动服务器

  • server.go:服务器相关代码

  • client.go:客户端相关代码,用户可以直接操作的可视化界面

  • user.go:用户类,用来封装用户的业务逻辑

架构

go语言如何实现即时通讯聊天室

完整代码

server.go

package mainimport ("fmt""io""net""sync""time")type Server struct {Ip   stringPort int//在线用户列表OnlineMap map[string]*UsermapLock   sync.RWMutex//消息广播的ChannelMessage chan string}func NewServer(ip string, port int) *Server {server := &Server{Ip:        ip,Port:      port,OnlineMap: make(map[string]*User),Message:   make(chan string),}return server}func (s *Server) Handler(conn net.Conn) {//业务逻辑//fmt.Println("链接建立成功")user := NewUser(conn, s)user.Online()//监听用户是否活跃isLive := make(chan bool)go func() {buf := make([]byte, 4096)for {n, error := conn.Read(buf)if n == 0 {user.Offline()return}if error != nil && error != io.EOF {fmt.Println("read error")}msg := string(buf[:n-1])user.DoMessage(msg)//表示用户活跃isLive <- true}}()for {select {case <-isLive://当前用户活跃,不做任何时,激活select,重置定时器case <-time.After(time.Second * 300)://超时,将user强制关闭user.SendMsg("你被踢了")close(user.C)conn.Close()return}}}func (s *Server) ListenMessager() {for {msg := <-s.Messages.mapLock.Lock()for _, user := range s.OnlineMap {user.C <- msg}s.mapLock.Unlock()}}func (s *Server) BroadCast(user *User, msg string) {sendMsg := "[" + user.Addr + "]" + user.Name + ":" + msgs.Message <- sendMsg}func (s *Server) Start() {listener, error := net.Listen("tcp", fmt.Sprintf("%s:%d", s.Ip, s.Port))if error != nil {fmt.Println("listener error...")return}defer listener.Close()go s.ListenMessager()for {conn, error := listener.Accept()if error != nil {fmt.Println("accept error...")continue}go s.Handler(conn)}}

client.go

package mainimport ("flag""fmt""io""net""os")type Client struct {ServerIp   stringServerPort intName       strinGConn       net.Connflag       int}func NewClient(serverIp string, serverPort int) *Client {client := &Client{ServerIp:   serverIp,ServerPort: serverPort,flag:       9999,}conn, error := net.Dial("tcp", fmt.Sprintf("%s:%d", serverIp, serverPort))if error != nil {fmt.Println("net dial error...")return nil}client.conn = connreturn client}func (c *Client) menu() bool {var flag intfmt.Println("1.公聊模式")fmt.Println("2.私聊模式")fmt.Println("3.修改用户名")fmt.Println("0.退出")fmt.Scanln(&flag)if flag >= 0 && flag <= 3 {c.flag = flagreturn true} else {fmt.Println(">>>>请输入合法数字<<<<")return false}}//修改用户名func (c *Client) UpdateName() bool {fmt.Println(">>>>请输入用户名")fmt.Scanln(&c.Name)sendMsg := "rename|" + c.Name + "\n"_, error := c.conn.Write([]byte(sendMsg))if error != nil {fmt.Println("conn.write error...")return false}return true}//公聊func (c *Client) PublicChat() {var chatMsg stringfmt.Println(">>>>请输入聊天内容,输入exit退出")fmt.Scanln(&chatMsg)for chatMsg != "exit" {if len(chatMsg) != 0 {msg := chatMsg + "\n"_, error := c.conn.Write([]byte(msg))if error != nil {fmt.Println("conn.Write error....")break}}chatMsg = ""fmt.Println(">>>>请输入聊天内容,输入exit退出")fmt.Scanln(&chatMsg)}}//私聊func (c *Client) PrivateChat() {var remoteUser stringvar chatMsg stringc.SelectUsers()fmt.Println(">>>>请输入聊天对象的用户名,输入exit退出")fmt.Scanln(&remoteUser)for remoteUser != "exit" {fmt.Println(">>>>请输入聊天内容,输入exit退出")fmt.Scanln(&chatMsg)for chatMsg != "exit" {if len(chatMsg) != 0 {msg := "to|" + remoteUser + "|" + chatMsg + "\n\n"_, error := c.conn.Write([]byte(msg))if error != nil {fmt.Println("conn.Write error....")break}}chatMsg = ""fmt.Println(">>>>请输入聊天内容,输入exit退出")fmt.Scanln(&chatMsg)}c.SelectUsers()remoteUser = ""fmt.Println(">>>>请输入聊天对象的用户名,输入exit退出")fmt.Scanln(&remoteUser)}}//查询在线用户func (c *Client) SelectUsers() {sendMsg := "who\n"_, error := c.conn.Write([]byte(sendMsg))if error != nil {fmt.Println("conn.Write error....")return}}//处理server返回的消息func (c *Client) DealResponse() {io.Copy(os.Stdout, c.conn)}func (c *Client) Run() {for c.flag != 0 {for c.menu() != true {}switch c.flag {case 1://公聊c.PublicChat()case 2://私聊c.PrivateChat()case 3://修改用户名c.UpdateName()}}}var serverIp stringvar serverPort intfunc init() {flag.StringVar(&serverIp, "ip", "127.0.0.1", "设置服务器IP地址(默认为127.0.0.1)")flag.IntVar(&serverPort, "port", 8888, "设置服务器端口(默认为8888)")}func main() {flag.Parse()client := NewClient(serverIp, serverPort)if client == nil {fmt.Println(">>>>链接服务器失败")return}go client.DealResponse()fmt.Println(">>>>链接服务器成功")client.Run()}

user.go

package mainimport ("net""strings")type User struct {Name   stringAddr   stringC      chan stringconn   net.Connserver *Server}func NewUser(conn net.Conn, server *Server) *User {userAddr := conn.RemoteAddr().String()user := &User{Name:   userAddr,Addr:   userAddr,C:      make(chan string),conn:   conn,server: server,}go user.ListenMessage()return user}//用户上线func (u *User) Online() {u.server.mapLock.Lock()u.server.OnlineMap[u.Name] = uu.server.mapLock.Unlock()u.server.BroadCast(u, "上线")}//用户下线func (u *User) Offline() {u.server.mapLock.Lock()delete(u.server.OnlineMap, u.Name)u.server.mapLock.Unlock()u.server.BroadCast(u, "下线")}//给当前user的客户端发送消息func (u *User) SendMsg(msg string) {u.conn.Write([]byte(msg))}//处理消息func (u *User) DoMessage(msg string) {if msg == "who" {//查询当前在线用户u.server.mapLock.Lock()for _, user := range u.server.OnlineMap {onlineMsg := "[" + user.Addr + "]" + user.Name + ":在线...\n"u.SendMsg(onlineMsg)}u.server.mapLock.Unlock()} else if len(msg) > 7 && msg[:7] == "rename|" {//修改用户名 rename|xxxnewName := strings.Split(msg, "|")[1]//判断名字是否已经存在_, ok := u.server.OnlineMap[newName]if ok {u.SendMsg("用户名已存在\n")} else {u.server.mapLock.Lock()delete(u.server.OnlineMap, u.Name)u.server.OnlineMap[newName] = uu.server.mapLock.Unlock()u.Name = newNameu.SendMsg("用户名成功修改为:" + newName + "\n")}} else if len(msg) > 4 && msg[:3] == "to|" {//私聊  to|zhangsan|你好//获取对方用户名remoteName := strings.Split(msg, "|")[1]if remoteName == "" {u.SendMsg("用户名格式不对\n")return}//获取对方userremoteUser, ok := u.server.OnlineMap[remoteName]if !ok {u.SendMsg("用户不存在\n")return}//获取消息msg := strings.Split(msg, "|")[2]if msg == "" {u.SendMsg("无消息内容,重新发送\n")}//发送消息remoteUser.SendMsg(u.Name + "对您说:" + msg)} else {u.server.BroadCast(u, msg)}}func (u *User) ListenMessage() {for {msg := <-u.Cu.conn.Write([]byte(msg + "\n"))}}

main.go

package mainfunc main() {server := NewServer("127.0.0.1", 8888)server.Start()}

读到这里,这篇“go语言如何实现即时通讯聊天室”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: go语言如何实现即时通讯聊天室

本文链接: https://www.lsjlt.com/news/329341.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言如何实现即时通讯聊天室
    本文小编为大家详细介绍“go语言如何实现即时通讯聊天室”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言如何实现即时通讯聊天室”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实现的功能:公聊,私聊,修改用户名...
    99+
    2023-06-30
  • 300行代码实现go语言即时通讯聊天室
    学了2年Java,因为工作原因需要转Golang,3天时间学习了下go的基本语法,做这样一个聊天室小项目来巩固串联一下语法。 实现的功能:公聊,私聊,修改用户名 只用到了四个类: m...
    99+
    2022-11-13
  • 如何使用Go语言和Redis实现在线聊天室
    如何使用Go语言和Redis实现在线聊天室引言:随着互联网的迅速发展,社交网络已经成为人们日常生活中不可或缺的一部分。在线聊天室作为社交网络中的一个重要组成部分,具有便捷、实时、交互性强等特点受到人们的欢迎。本文以Go语言和Redis为基础...
    99+
    2023-10-27
    Go语言 redis 在线聊天室
  • 如何使用Go语言开发Websocket聊天室
    如何使用Go语言开发Websocket聊天室Websocket是一种实时通信协议,通过建立一次连接,可以在服务器和客户端之间进行双向通信。在开发聊天室时,Websocket是一个非常好的选择,因为它可以实现实时消息交流,并且能够提供高效的性...
    99+
    2023-12-14
    Go语言 websocket 聊天室
  • PHP实现即时通讯聊天消息发送功能
    随着互联网的不断发展,即时通讯已经成为现代社会日常沟通的主要形式,因此实现即时通讯聊天消息发送功能成为了各个网站和应用程序的必备特性。本文将介绍PHP实现即时通讯聊天消息发送功能的步骤和注意事项。一、数据库创建首先,我们需要创建一个数据库来...
    99+
    2023-05-22
    PHP 实时通讯 消息发送
  • Go语言怎么实现一个简单的并发聊天室
    今天小编给大家分享一下Go语言怎么实现一个简单的并发聊天室的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。并发聊天服务器这里主...
    99+
    2023-06-29
  • SpringBoot中webSocket如何实现即时聊天
    这篇文章主要介绍了SpringBoot中webSocket如何实现即时聊天,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。springboot是什么springboot一种全新...
    99+
    2023-06-14
  • 如何利用微信小程序和php实现即时通讯聊天功能
    目录一、PHP7安装Swoole扩展1、自定义安装2、宝塔面板安装PHP swoole扩展二、配置nginx反向代理三、微信小程序socket合法域名配置四、效果演示和代码1、小程序...
    99+
    2022-11-13
  • Go语言实现一个简单的并发聊天室的项目实战
    目录写在前面并发聊天服务器具体代码服务端客户端 总结写在前面 Go语言在很多方面天然的具备很多便捷性,譬如网络编程,并发编程。而通道则又是Go语言实现并发编程的重要工具,因...
    99+
    2022-11-13
  • 如何用Go语言开发一个简单的即时通讯应用
    如何用Go语言开发一个简单的即时通讯应用随着互联网的发展和人们对实时沟通需求的增加,即时通讯应用在我们生活中扮演着越来越重要的角色。Go语言作为一种开源的高性能编程语言,越来越受开发者们的喜爱。本文将介绍如何使用Go语言开发一个简单的即时通...
    99+
    2023-11-20
    开发 即时通讯 关键词:Go语言
  • 如何使用Go语言和Redis开发实时聊天功能
    如何使用Go语言和Redis开发实时聊天功能在如今这个互联网时代,聊天功能已经成为了大部分应用的基本需求。为了实现实时聊天功能,我们可以使用Go语言和Redis作为后台技术支持。Go语言是一种高效且简洁的编程语言,而Redis则是一个开源的...
    99+
    2023-10-28
    Go语言 redis 实时聊天
  • Node.js websocket如何使用socket.io库实现实时聊天室
    这篇文章主要介绍Node.js websocket如何使用socket.io库实现实时聊天室,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!认识websocketWebSocket p...
    99+
    2022-10-19
  • php如何实现即时通讯实例
    本篇内容介绍了“php如何实现即时通讯实例”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php实现即时通讯实例的方法:1、搭建websock...
    99+
    2023-07-04
  • 如何使用C#基于Socket的TCP通信实现聊天室
    这篇文章给大家分享的是有关如何使用C#基于Socket的TCP通信实现聊天室的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下一.Socket(套接字)通信概念套接字(socket)是通信的基石,用于描述...
    99+
    2023-06-29
  • 聊聊Go语言中如何实现代码跳转
    Go语言(Golang)是一种开源的编程语言,由Google在2007年开始设计和开发。Go语言简单易学,同时又具有高性能、高并发、高可靠性等特点,因而越来越受到程序员的喜爱。在日常的开发过程中,我们常常需要进行代码跳转(即从一个源代码位置...
    99+
    2023-05-14
  • 如何在PHP中实现即时通讯功能
    随着社交媒体和移动互联网的迅速发展,即时通讯(IM)已经成为人们生活中不可或缺的一部分。开发者们也开始向自己的网站或应用程序中添加IM功能,以提供更好的用户体验和互动性。PHP作为一种流行的服务器端编程语言,学会如何在其中实现IM功能可以为...
    99+
    2023-05-21
    PHP 实现 即时通讯
  • nodejs如何结合Socket.IO实现websocket即时通讯
    这篇文章给大家分享的是有关nodejs如何结合Socket.IO实现websocket即时通讯的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为什么要用 websocketwebsocket 是一种网络通信协议,一...
    99+
    2023-06-25
  • 聊聊如何使用Go语言来实现密码算法
    密码算法是网络安全的重要组成部分,现在随着互联网的普及,数据的安全问题越来越被人们所关注。Go语言是一个快速的编译型语言,由Google于2009年推出,已经成为最热门的编程语言之一。本文将介绍如何使用Go语言来实现密码算法。首先,我们需要...
    99+
    2023-05-14
  • nodejs如何结合Socket.IO实现的即时通讯功能
    这篇文章主要为大家展示了“nodejs如何结合Socket.IO实现的即时通讯功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“nodejs如何结合Socket...
    99+
    2022-10-19
  • 如何使用MySQL和JavaScript实现一个简单的即时聊天功能
    如何使用MySQL和JavaScript实现一个简单的即时聊天功能随着社交媒体的普及,即时聊天已经成为了人们日常生活中必不可少的一部分。在这篇文章中,我们将介绍如何使用MySQL和JavaScript来实现一个简单的即时聊天功能。首先,我们...
    99+
    2023-10-22
    MySQL JavaScript 即时聊天
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作