Golang TCP服务器用户修改名字、查询用户在线以及私聊功能

本文介绍了使用Golang实现的一个服务器关键代码,涉及用户查询(who:),用户名更改(rename:XXX)和私聊触发(to:XXX:msg)功能。通过用户互发消息和获取用户列表,展示了服务器如何处理不同命令并进行同步操作。同时,展示了sendMsg、getUserList和userRename等核心函数的实现,确保了用户操作的正确性和并发安全性。
摘要由CSDN通过智能技术生成

服务器块关键代码:

 

根据协议调用不同的命令,我这边以“who:”查询用户是否在线,“rename:XXX”进行用户名更改,“to:XXX:msg”触发私聊

 if len(msgStr)>7 && msgStr[:7]=="rename:" {
			this.server.userRename(this.Conn.RemoteAddr().String(),strings.Split(msgStr,":")[1])
		} else if len(msgStr)==4 && msgStr[:4]=="who:" {
			this.server.getUserList(this.Conn.RemoteAddr().String())
		}else if len(msgStr)>4 && msgStr[:3]=="to:" {
			if len(strings.Split(msgStr,":"))==3 {
				this.server.sendMsg(strings.Split(msgStr,":")[1],this.Conn.RemoteAddr().String(),
					this.Name,strings.Split(msgStr,":")[2])
			}
		}

 

根据命令查询相应的用户列表做对应操作。


func (this *Server) sendMsg(sendUsername string,fromUserip string,fromUsername string,msg string){
	this.userMutex.Lock()

	for _, v := range this.users {
		if v.Name == sendUsername {
			sendMsg := "[" + fromUserip +"]"+fromUsername+": " +msg+"\n"
			_,err := v.Conn.Write([]byte(sendMsg))
			if err != nil {
				fmt.Println("server brodCast err:",err)
			}
		}
	}

	this.userMutex.Unlock()
}

func (this *Server) getUserList(ip string) {
	this.userMutex.Lock()
	user ,ok := this.users[ip]
	if ok {

		for _, v := range this.users {
			sendMsg := "[" + v.Conn.RemoteAddr().String()+"]"+v.Name+"\n"
			_,err := user.Conn.Write([]byte(sendMsg))
			if err != nil {
				fmt.Println("server brodCast err:",err)
			}
		}

	} else {
		println("user no found!")
	}
	this.userMutex.Unlock()
}

func (this *Server) userRename(ip string,name string) {
	this.userMutex.Lock()
	_ ,ok := this.users[ip]
	if ok {
		this.users[ip].Name = name
	} else {
		println("user no found!")
	}
	this.userMutex.Unlock()
}

 

实现效果:

 

 

目录:

Golang 从入门到放弃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值