標籤:
今天介紹golang版本的通訊基礎:基於TCP的用戶端和伺服器實現,參考書籍:The Way To Go
那時學習java的時候也是做過通訊的,當時是socket編程,伺服器監聽某一個連接埠,然後客戶機去串連,簡單的聊天室就實現了。後來有變成多線程的聊天室,可以進行群聊什麼的了,後期可以傳圖片傳音樂,加上UI那一塊兒,山寨QQ就OK了。現在我來用golang實現一下簡易的聊天室,實現了客戶機串連伺服器,給伺服器發訊息,伺服器接受訊息,客戶機退出,伺服器可以收到退出資訊,以及多個客戶機同時連入一個伺服器。主要的思路和java一樣的,伺服器監聽某一個連接埠,客戶機去串連,然後發送訊息就OK了。上代碼了。
package main
//伺服器端
import (
"fmt"
"log"
"net" //支援通訊的包
)
//開始伺服器
func startServer() {
//串連主機、連接埠,採用tcp方式通訊,監聽7777連接埠
listener, err := net.Listen("tcp", "localhost:7777")
checkError(err)
fmt.Println("建立成功!")
for {
//等待用戶端接入
conn, err := listener.Accept()
checkError(err)
//開一個goroutines處理用戶端訊息,這是golang的特色,實現並發就只go一下就好
go doServerStuff(conn)
}
}
//處理用戶端訊息
func doServerStuff(conn net.Conn) {
nameInfo := make([]byte, 512) //產生一個緩衝數組
_, err := conn.Read(nameInfo)
checkError(err)
for {
buf := make([]byte, 512)
_, err := conn.Read(buf) //讀取客戶機發的訊息
flag := checkError(err)
if flag == 0 {
break
}
fmt.Println(string(buf)) //列印出來
}
}
//檢查錯誤
func checkError(err error) int {
if err != nil {
if err.Error() == "EOF" {
//fmt.Println("使用者退出了")
return 0
}
log.Fatal("an error!", err.Error())
return -1
}
return 1
}
func main() {
//開啟服務
startServer()
}
以上是伺服器的實現,具體看代碼注釋
package main
//客戶機
import (
"bufio"
"fmt"
"log"
"net"
"os"
"strings"
)
//串連伺服器
func connectServer() {
//接通
conn, err := net.Dial("tcp", "localhost:7777")
checkError(err)
fmt.Println("串連成功!\n")
//輸入
inputReader := bufio.NewReader(os.Stdin)
fmt.Println("你是誰?")
name, _ := inputReader.ReadString(‘\n‘)
//
trimName := strings.Trim(name, "\r\n")
conn.Write([]byte(trimName + " 接入了\n "))
for {
fmt.Println("我們來聊天吧!按quit退出")
//讀一行
input, _ := inputReader.ReadString(‘\n‘)
trimInput := strings.Trim(input, "\r\n")
//如果quit就退出
if trimInput == "quit" {
fmt.Println("再見")
conn.Write([]byte(trimName + " 退出了 "))
return
}
//寫出來
_, err = conn.Write([]byte(trimName + " says " + trimInput))
}
}
//檢查錯誤
func checkError(err error) {
if err != nil {
log.Fatal("an error!", err.Error())
}
}
//主函數
func main() {
//串連servser
connectServer()
}
以上是客戶機代碼,具體看注釋
啟動並執行時候,分別go run server和client,你變可以看到這樣就可以串連成功了。
伺服器只用開一個,客戶機可以開任意個,並且相互之間沒有幹擾。
OK,一個簡單的多線程聊天室就實現了。後期可以加上更多的功能,但無非就是去處理輸入輸出,重點都已經有了。
--------------------------------------------------------------------------------
歡迎提出建議!
go實現的簡易TCP的用戶端和伺服器