go语言怎么创建websocket服务(golang怎么并发聊天服务器)

技术GO使用socket和channel怎么实现简单控制台聊天室今天就跟大家聊聊有关GO使用socket和channel怎么实现简单控制台聊天室,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大

今天跟大家聊聊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

(0)

相关推荐

  • ORA-00313 ORA-00312 redo日志报错怎么处理

    技术ORA-00313 ORA-00312 redo日志报错怎么处理小编给大家分享一下ORA-00313 ORA-00312 redo日志报错怎么处理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家

    攻略 2021年11月17日
  • python中如何使用pip安装第三方库

    技术python中如何使用pip安装第三方库本篇文章为大家展示了python中如何使用pip安装第三方库,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言本文的文字及图片来源于网

    攻略 2021年11月2日
  • 蛋糕不蓬松的原因,蛋糕做出来会塌不泡是什么原因

    技术蛋糕不蓬松的原因,蛋糕做出来会塌不泡是什么原因蛋糕的膨发情况就与蛋白打发状态息息相关。蛋糕烤出来回缩蛋糕不蓬松的原因、总是膨发不起来是因为蛋白打发不到位,所以就算加了泡打粉也膨胀不起来。蛋糕塌陷!大家都知道热胀冷缩的

    生活 2021年10月30日
  • 春联由来,春联的习俗是如何流传开的

    技术春联由来,春联的习俗是如何流传开的春联二三事实在没有想到春联由来,我家的春联成了他人过目不忘的风景!前年,因为东面邻家华栋殿宇欣喜落成,我家的围墙、地皮被拉裂扯破,主房也受到了一些损伤,被迫重砌围墙、装修房屋,我们的

    生活 2021年10月23日
  • 拉链表和快照表怎么更新数据(数据仓库的拉链表)

    技术数据仓库企业数仓拉链表如何制作​这篇文章主要为大家展示了“数据仓库企业数仓拉链表如何制作”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“数据仓库企业数仓拉链表如何制作”这篇

    攻略 2021年12月24日
  • mysql时间如何转换时间戳

    技术mysql时间如何转换时间戳本篇内容介绍了“mysql时间如何转换时间戳”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成

    攻略 2021年11月26日