首页 > 其他分享 >【golang实现即时通讯系统】(一)

【golang实现即时通讯系统】(一)

时间:2023-03-25 16:24:15浏览次数:36  
标签:string err 系统 即时通讯 Server golang User go conn

即时通讯系统

1.基础server构建

  1. 创建一个Server的结构体,结构体应该包含服务端的IP和端口
  2. 写一个创建Server的方法
  3. 创建一个启动Server函数
  4. 创建一个业务链接函数

server.go

package main
import (
	"fmt"
	"net"
)

type Server struct{
    Ip string
   Port int
}
//创建Server对象
func NewServer(ip string,port int)*Server{
    server:=&Server{
        Ip:ip,
        Port:port,
    }
    return server
}
//启动Server服务函数
func(this *Server)Start(){
    listener,err:=net.Listen("tcp",fmt.Sprintf("%s:%d",this.Ip,this.Port))
    if err!=nil{
        fmt.Plrintln("Accept Error:",err)
        return
    }
    for{
         conn,err:=listener.Accept()
        if err!=nil{
            fmt.Println("Listener Accept err:",err)
            continue
        }
        go this.Handler(conn)
    }
  //Handler函数 业务函数
    func (this *Server)Handler(conn net.Conn){
        fmt.Println("业务链接成功!")
    }
}

main.go

package main

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

2.用户上线及广播功能

  1. user.go
    1. 创建User结构体
    2. 创建User对象
    3. 监听User对应channel消息
  2. server.go
    1. Server结构体新增在线用户表和Message管道属性
    2. 在处理客户端上线的Handler函数中根据端口创建用户并添加到在线用户表中
    3. Handler函数中添加广播消息函数,广播用户上线的消息
    4. 添加广播消息的函数
    5. 添加广播消息channel方法
    6. 用一个goroutine单独监听Message管道

user.go

package main
import "net"
type User struct{
    Name string 
    Addr string
    C chan string
    conn net.Conn
}

//创建User对象
func NewUser(conn net.Conn)*User{
    userAddr:=conn.RemoteAddr().String()
    user:=&User{
        Name:userAddr,
        Addr:userAddr,
        C :make(chan string),
        conn:conn
    }
    
    //监听当前user的channel消息
    go user.ListenMessage()
    return user
}
//监听当前用户channel管道消息函数,一旦有消息,就直接发送给对端客户端
func (this *User)ListenMessage(){
    for {
        msg:=<-this.C
        this.conn.Write([]byte(msg+"\n"))
    }
}

server.go

package main

type Server struct {
    Ip string
    Port int
    Message chan string 
    OnlineMap map[string]*User
    mapLock sync.RWMutex
}
//创建一个Server对象
func NewServer(ip string ,port int)*Server{
    server:=&Server{
        Ip:ip,
        Port:port,
        Message:make(chan string),
        OnlineMap:make(map[string]*User)
    }
    return server
}
//创建启动函数
func (this *Server)Start(){
    listener,err:=net.Listen("tcp",fmt.Sprintf("%s:%d",this.IP,this.Port))
    if err!=nil{
        fmt.Println("net.Listen err:",err)
        return
    }
    defer listener.Close()
    go this.ListenMessager()
    for {
        conn,err:=listener.Accept()
         if err!=nil{
        fmt.Println("Listenner accept err:",err)
        continue
    	}
        go this.Handler(conn)
    }
}
//创建Handler函数
func (this *Server)Handler(conn net.Conn){
    user:=NewUser(conn)
    this.mapLock.Lock()
    this.OnlineMap[user.Name]=user
    this.mapLock.Unlock()
    //广播当前用户上线的消息
    this.BroadCast(user,"已上线")
    //阻塞当前handler
    select{}
}
//监听Message广播消息channel的goroutine,一旦有消息就发送给全部的在线User
func (this *Server)ListenMessager(){
    msg:=<-this.Message
    this.mapLock.Lock()
    for _,cli:=range OnlineMap{
        cli.C<-msg
    }
    this.mapLock.Unlock()
}
//广播函数
func (this *Server)BroadCast(user *User,msg string){
    sendMsg:="["+user.Addr+"]"+user.name+":"+msg
    this.Message<-sendMsg
}

标签:string,err,系统,即时通讯,Server,golang,User,go,conn
From: https://www.cnblogs.com/Weber-security/p/17254960.html

相关文章

  • 在windows系统中设置MySQL数据库
    MySQL搭建效果图step1:下载安装包https://downloads.mysql.com/archives/community/step2:解压后即完成安装step3:创建my.ini配置文件(注意路径)[mysqld]......
  • c# 获取系统dpi
    c#获取系统dpi正在搜索:c#获取系统dpi正在为你生成答案…您可以使用以下代码获取当前屏幕的DPI:GraphicscurrentGraphics=Graphics.FromHwnd(newWindowInterop......
  • 类似抖客联盟系统开发,类似抖客联盟系统开发多少钱,类似抖客联盟app系统开发贴牌oem
    类似抖客联盟系统开发,类似抖客联盟系统开发多少钱,类似抖客联盟app系统开发贴牌,抖客商城系统开发,抖客商城app开发,抖客商城小程序开发,抖客商城软件开发,抖客商城系统平台搭建,抖......
  • 对系统理论的简单认识
      系统理论是有钱学森院士所倡导的系统科学,它是一组相互连接的要素构成,能够实现某个目标的整体,是研究一般模式、结构和规律的学问。系统具有整体性,关联性,等级结构性,动......
  • GPA排名系统
    0038:GPA排名系统查看提交统计提问总时间限制: 1000ms 内存限制: 65536kB描述目前,高等院校往往采用GPA来评价学生的学术表现。传统的排名方式是求对每一个学生的平均成绩......
  • C++餐厅点餐结算系统[2023-03-25]
    C++餐厅点餐结算系统[2023-03-25]题目某餐馆根据实际需要欲开发一套《餐厅点餐结算系统》,具体要求如下:1、系统用户包括消费者、收银员、厨师、服务员、餐厅老板、系统......
  • 操作系统(2.4.5)--管程机制
    1.管程的定义利用共享数据结构抽象地表示系统中的共享资源,而把对该共享数据结构实施的操作定义为一组过程进程对共享资源的申请、释放和其它操作,都是通过这组过程对共享数据......
  • RT-Thread BSP qemu-virt64-aarch64 挂载 ext4文件系统
    前言经常简单的配置,在RT-ThreadBSPqemu-virt64-aarch64上可以支持fat文件系统,但是如何支持ext4文件系统呢?经过验证,也是配置使能ext4就可以支持ext4软件包当前RT......
  • RT-Thread BSP qemu-virt64-aarch64 文件系统
    前言前面大体上搭建了RT-ThreadBSPqemu-virt64-aarch64的交叉编译环境,运行后发现,文件系统没有挂载上,感觉是没有mkfs。通过RT-Thread官方的文档,找到了解决方法创建独立......
  • 第2讲 发那科机器人系统组成
    本体,控制柜,示教器;        PREV 返回F1-F5  选项切换SHIFT  和其他按键组合SELECT 列出和创建程序EDIT 编辑和执行程序DATA 显示......