go實現的簡易TCP的用戶端和伺服器

來源:互聯網
上載者:User

標籤:

今天介紹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的用戶端和伺服器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.