白云岛资源网 Design By www.pvray.com

前言

运用go里面的net包中的相关方法来实现一个基于tcp的简单多人聊天室,用一个服务器来管理,主要反馈客户端是否连接成功并显示客户端输入的内容,并且发送给每一个在服务器上连接的客服端,下面话不多说了,来一起看看详细的介绍吧。

示例代码

服务器代码

// server 
package main 
import ( 
 "fmt" 
 "net" 
) 
 
var ConnMap map[string]*net.TCPConn 
func checkErr(err error) int { 
 if err != nil { 
 if err.Error() == "EOF" { 
  fmt.Println("用户退出") 
  return 0 
 } 
 fmt.Println("发生错误") 
 return -1 
 } 
 return 1 
} 
func say(tcpConn *net.TCPConn) { 
 for { 
 data := make([]byte, 256) 
 total, err := tcpConn.Read(data) 
 if err != nil { 
  fmt.Println(string(data[:total]), err) 
 } else { 
  fmt.Println(string(data[:total])) 
 } 
 flag := checkErr(err) 
 if flag == 0 { 
  break 
 } 
 for _, conn := range ConnMap { 
  if conn.RemoteAddr().String() == tcpConn.RemoteAddr().String() { 
  continue 
  } 
  conn.Write(data[:total]) 
 } 
 } 
} 
func main() { 
 //var conn net.TCPConn 
 //localAddr :=conn.LocalAddr().String() 
 //fmt.Println(localAddr) 
 //tcpAddr, _ := net.ResolveTCPAddr("tcp",localAddr) 
 tcpAddr, _ := net.ResolveTCPAddr("tcp", "192.168.128.216:8080") 
 tcpListen, _ := net.ListenTCP("tcp", tcpAddr) 
 ConnMap = make(map[string]*net.TCPConn) 
 for { 
 tcpConn, _ := tcpListen.AcceptTCP() 
 defer tcpConn.Close() 
 ConnMap[tcpConn.RemoteAddr().String()] = tcpConn 
 fmt.Println("连接客户端信息:", tcpConn.RemoteAddr().String()) 
 go say(tcpConn) 
 } 
} 

本来打算用系统的LocalAddr()函数来直接调用本地网络地址,但是这里调用一直报格式的错误,所以这里用本地地址直接输在里面,端口是8080//192.168.247.128:8080,也可以改成和客户端相似的代码来进行调用,但鉴于服务器唯一,所以就不做更改了

客户端代码

// client 
package main 
import ( 
 "fmt" 
 "net" 
 "os" 
) 

var ch chan int = make(chan int) 
var nickname string 
func reader(conn *net.TCPConn) { 
 buff := make([]byte, 256) 
 for { 
 j, err := conn.Read(buff) 
 if err != nil { 
  ch <- 1 
  break 
 } 
 fmt.Printf("%s\n", buff[0:j]) 
 } 
} 
func main() { 
 if len(os.Args) != 2 { 
 fmt.Fprintf(os.Stderr, "Usage:%s host:port", os.Args[0]) 
 os.Exit(1) 
 } 
 service := os.Args[1] 
 TcpAdd, _ := net.ResolveTCPAddr("tcp", service) 
 //TcpAdd, _ := net.ResolveTCPAddr("tcp", "localhost:8080") 
 conn, err := net.DialTCP("tcp", nil, TcpAdd) 
 if err != nil { 
 fmt.Println("服务没打开") 
 os.Exit(1) 
 } 
 defer conn.Close() 
 go reader(conn) 
 fmt.Println("请输入昵称") 
 fmt.Scanln(&nickname) 
 fmt.Println("你的昵称是:", nickname) 
 //var str string 
 for { 
 var msg string 
 fmt.Scan(&msg) 
 fmt.Print("<" + nickname + ">" + "说:") 
 //for i, _ := range msg { 
 // fmt.Printf("%c", msg[i]) 
 //} 
 fmt.Println(msg) 
 b := []byte("<" + nickname + ">" + "说:" + msg) 
 conn.Write(b) 
 select { 
 case <-ch: 
  fmt.Println("server发生错误,请重新连接") 
  os.Exit(2) 
 default: 
 } 
 } 
} 

客户端主要就是向服务器发起连接,然后发送和接收数据,原计划定义一个字符切片来存储读来的数据,但是出现了调用fmt.Println()来输出是时候显示ASCII码的错误,所以改成直接往一个空字符串里面读写,然后再来调用fmt.Println() ,显示出正确的字符串

运行服务器

go build server.go

./server

或  go run server.go

运行客户端

go build client.go

./client 服务器地址:端口(上面例子是192.168.247.128:8080)

利用GO语言实现多人聊天室实例教程

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

白云岛资源网 Design By www.pvray.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
白云岛资源网 Design By www.pvray.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。