今天介紹golang版本的通訊基礎:基於TCP的客戶端和服務器實現,參考書籍:The Way To Gojava
那時學習java的時候也是作過通訊的,當時是socket編程,服務器監聽某一個端口,而後客戶機去鏈接,簡單的聊天室就實現了。後來有變成多線程的聊天室,能夠進行羣聊什麼的了,後期能夠傳圖片傳音樂,加上UI那一起,山寨QQ就OK了。如今我來用golang實現一下簡易的聊天室,實現了客戶機鏈接服務器,給服務器發消息,服務器接受消息,客戶機退出,服務器能夠收到退出信息,以及多個客戶機同時連入一個服務器。主要的思路和java同樣的,服務器監聽某一個端口,客戶機去鏈接,而後發送消息就OK了。上代碼了。
package maingolang
//服務器端
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"
)socket
//鏈接服務器
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))
}
}tcp
//檢查錯誤
func checkError(err error) {
if err != nil {
log.Fatal("an error!", err.Error())
}
}
//主函數
func main() {
//鏈接servser
connectServer()
}
以上是客戶機代碼,具體看註釋
運行的時候,分別go run server和client,你變能夠看到這樣就能夠鏈接成功了。
服務器只用開一個,客戶機能夠開任意個,而且相互之間沒有干擾。
OK,一個簡單的多線程聊天室就實現了。後期能夠加上更多的功能,但無非就是去處理輸入輸出,重點都已經有了。
--------------------------------------------------------------------------------
歡迎提出建議!