今天跟大家聊聊GO如何利用socket和channel实现简单的控制台聊天室。很多人可能不太了解。为了让大家更好的了解,边肖为大家总结了以下内容。希望你能从这篇文章中有所收获。
利用socket和channel实现简单的控制台聊天室。
在这里,用socket和channel演示如何在GO中编写一个简单的网络程序。
00-1010聊天室主要功能:用户可以加入/离开聊天室;每个用户发送的消息都会广播给每个人。
聊天室分为客户端和服务器端。客户端负责发送消息和打印服务器消息。服务器负责接收客户端消息并将其广播给每个人。
客户端可以使用telnet程序。
服务器需要实现。要实现的功能,
如何保存多个客户端的连接,管理连接访问和断开?
如何接收和广播客户端消息
功能分析
通过功能分析分为聊天室结构和客户端结构。
聊天室结构负责管理当前访问的客户端和广播消息。
客户端负责管理套接字连接以及要接收和发送的数据。
客户端连接/断开时通知聊天室;客户端发送的消息实际上是转发到聊天室,然后聊天室广播出去。
实现思路
packagemain
导入(
布菲奥
fmt '
日志
“净”
)
typeClientstruct{
idstring
conn*net。指挥操舵
messagechanstring
}
typeHubstruct{
clientsmap[*Client]bool
输入扫描*客户端
离开加拿大*客户
消息说明
}
func main(){ 0
hub:=Hub{
clients:make(映射[*Client]bool),
输入:make(更改*客户端),
离开:make(变更*客户端),
消息:make(chanstring),
}
监听器,err:=net。监听(' tcp ',' :8000 ')
伊弗。=零
日志。致命的
}
gohub.broadcaster()
对于{ 0
conn,err:=监听器。接受()
伊弗。=零
日志。Println(错误)
继续
}
gohub.handleConn(conn)
}
}
func(hub*Hub)广播公司(){ 0
对于{ 0
选择{
casemsg :=-hub . messages :
forcli:=rangehub.clients{
CLI . message-消息
}
case CLI :=-hub . enter :
hub.clients[cli]=true
case CLI :=-hub . leave :
删除(hub.clients,cli)
}
}
}
func(Hub * Hub)handleConn(connet。conn){ 0
德雷康。关闭()
ch:=make(chanstring)
who:=conn.RemoteAddr()。字符串()
client:=客户{谁,conn,ch}
gohub.writeLoop(客户端)
ch-'欢迎'客户端. id
hub . messages-client . id“join chat”
hub.entering客户端
hub.readLoop(客户端)
hub . messages-client . id“has left”
hub . leaking-客户端
}
func(hub*Hub)writeLoop(客户端*客户端){ 0
formsg :=range client . message {
fmt。Fprintf(*client.conn,' %s\n ',msg)
}
}
func(hub*Hub)readLoop(客户端*客户端){ 0
input:=bufio。NewScanner(*client.conn)
例如。扫描(){ 0
hub.messages-client.id ': '输入。文本()
}
实现}
完整代码
的关键是封装客户端通信通道,远程发送的消息和聊天室广播的消息都是通过这个通道传递的,这个通道绑定到客户端。
在引用链接中,直接使用channel来定义客户端类型client chan- string实际上可以更好地表达这一点。
为了便于理解,通道被封装为客户端的通信通道,客户端还可以有其他属性,如id、连接和超时。
看完以上内容,你对GO如何利用socket和channel实现简单的控制台聊天室有了更好的理解吗?如果您想了解更多知识或相关内容,请关注行业资讯频道,感谢您的支持。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/153811.html