国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Golang > 正文

利用GO語(yǔ)言實(shí)現(xiàn)多人聊天室實(shí)例教程

2020-04-01 18:58:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

運(yùn)用go里面的net包中的相關(guān)方法來(lái)實(shí)現(xiàn)一個(gè)基于tcp的簡(jiǎn)單多人聊天室,用一個(gè)服務(wù)器來(lái)管理,主要反饋客戶(hù)端是否連接成功并顯示客戶(hù)端輸入的內(nèi)容,并且發(fā)送給每一個(gè)在服務(wù)器上連接的客服端,下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。

示例代碼

服務(wù)器代碼

// 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("用戶(hù)退出")   return 0  }  fmt.Println("發(fā)生錯(cuò)誤")  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("連接客戶(hù)端信息:", tcpConn.RemoteAddr().String())  go say(tcpConn)  } } 

本來(lái)打算用系統(tǒng)的LocalAddr()函數(shù)來(lái)直接調(diào)用本地網(wǎng)絡(luò)地址,但是這里調(diào)用一直報(bào)格式的錯(cuò)誤,所以這里用本地地址直接輸在里面,端口是8080//192.168.247.128:8080,也可以改成和客戶(hù)端相似的代碼來(lái)進(jìn)行調(diào)用,但鑒于服務(wù)器唯一,所以就不做更改了

客戶(hù)端代碼

// 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("服務(wù)沒(méi)打開(kāi)")  os.Exit(1)  }  defer conn.Close()  go reader(conn)  fmt.Println("請(qǐng)輸入昵稱(chēng)")  fmt.Scanln(&nickname)  fmt.Println("你的昵稱(chēng)是:", nickname)  //var str string  for {  var msg string  fmt.Scan(&msg)  fmt.Print("<" + nickname + ">" + "說(shuō):")  //for i, _ := range msg {  // fmt.Printf("%c", msg[i])  //}  fmt.Println(msg)  b := []byte("<" + nickname + ">" + "說(shuō):" + msg)  conn.Write(b)  select {  case <-ch:   fmt.Println("server發(fā)生錯(cuò)誤,請(qǐng)重新連接")   os.Exit(2)  default:  }  } } 

客戶(hù)端主要就是向服務(wù)器發(fā)起連接,然后發(fā)送和接收數(shù)據(jù),原計(jì)劃定義一個(gè)字符切片來(lái)存儲(chǔ)讀來(lái)的數(shù)據(jù),但是出現(xiàn)了調(diào)用fmt.Println()來(lái)輸出是時(shí)候顯示ASCII碼的錯(cuò)誤,所以改成直接往一個(gè)空字符串里面讀寫(xiě),然后再來(lái)調(diào)用fmt.Println() ,顯示出正確的字符串

運(yùn)行服務(wù)器

go build server.go

./server

或  go run server.go

運(yùn)行客戶(hù)端

go build client.go

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

go語(yǔ)言實(shí)現(xiàn)聊天室,go語(yǔ)言聊天室,go,聊天室

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 平利县| 丘北县| 汉中市| 黔西县| 定兴县| 桓台县| 丹江口市| 永济市| 瑞昌市| 舒兰市| 宾阳县| 娱乐| 小金县| 新乡市| 鹤庆县| 西乌珠穆沁旗| 肥乡县| 株洲市| 南川市| 凉山| 云林县| 沧州市| 湖口县| 宝清县| 临猗县| 福海县| 深圳市| 东山县| 浦东新区| 仙桃市| 西安市| 普兰县| 汨罗市| 高安市| 汉中市| 南城县| 江孜县| 巩留县| 清远市| 通山县| 措美县|