go實現的簡易TCP的客戶端和服務器

今天介紹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,一個簡單的多線程聊天室就實現了。後期能夠加上更多的功能,但無非就是去處理輸入輸出,重點都已經有了。

--------------------------------------------------------------------------------

歡迎提出建議!

相關文章
相關標籤/搜索