九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
用Golang實現(xiàn) echo服務器/客戶端

用Golang實現(xiàn) echo服務器/客戶端

本節(jié)我們就從實現(xiàn)一個簡單的echo的服務端/客戶端來入手, 了解golang的實現(xiàn)tcp長連接服務器的具體細節(jié).

首先, 我們先列一下服務端的實現(xiàn)思路及步驟:

  1. 創(chuàng)建一個套接字對象, 指定其IP以及端口.
  2. 開始監(jiān)聽套接字指定的端口.
  3. 如有新的客戶端連接請求, 則建立一個goroutine, 在goroutine中, 讀取客戶端消息, 并轉(zhuǎn)發(fā)回去, 直到客戶端斷開連接
  4. 主進程繼續(xù)監(jiān)聽端口.

我們可以在實驗環(huán)境的主文件夾中, 建立一個名為server.go的文件, 在其中編寫服務器端程序代碼
服務端程序清單如下:

server.go

package mainimport (    "bufio"    "fmt"    "net"    "time")func main() {    var tcpAddr *net.TCPAddr    tcpAddr, _ = net.ResolveTCPAddr("tcp", "127.0.0.1:9999")    tcpListener, _ := net.ListenTCP("tcp", tcpAddr)    defer tcpListener.Close()    for {        tcpConn, err := tcpListener.AcceptTCP()        if err != nil {            continue        }        fmt.Println("A client connected : " + tcpConn.RemoteAddr().String())        go tcpPipe(tcpConn)    }}func tcpPipe(conn *net.TCPConn) {    ipStr := conn.RemoteAddr().String()    defer func() {        fmt.Println("disconnected :" + ipStr)        conn.Close()    }()    reader := bufio.NewReader(conn)    for {        message, err := reader.ReadString('\n')        if err != nil {            return        }        fmt.Println(string(message))        msg := time.Now().String() + "\n"        b := []byte(msg)        conn.Write(b)    }}

接著, 我們打開終端, 編譯服務端程序:

go build server.go

編譯成功的話, 會在主目錄中看到編譯成功的server程序

接下來, 是客戶端的代碼實現(xiàn)步驟:

  1. 創(chuàng)建一個套接字對象, ip與端口指定到上面我們實現(xiàn)的服務器的ip與端口上.
  2. 使用創(chuàng)建好的套接字對象連接服務器.
  3. 連接成功后, 開啟一個goroutine, 在這個goroutine內(nèi), 定時的向服務器發(fā)送消息, 并接受服務器的返回消息, 直到錯誤發(fā)生或斷開連接.

程序清單如下:

client.go

package mainimport (    "bufio"    "fmt"    "net"    "time")var quitSemaphore chan boolfunc main() {    var tcpAddr *net.TCPAddr    tcpAddr, _ = net.ResolveTCPAddr("tcp", "127.0.0.1:9999")    conn, _ := net.DialTCP("tcp", nil, tcpAddr)    defer conn.Close()    fmt.Println("connected!")    go onMessageRecived(conn)    b := []byte("time\n")    conn.Write(b)    <-quitSemaphore}func onMessageRecived(conn *net.TCPConn) {    reader := bufio.NewReader(conn)    for {        msg, err := reader.ReadString('\n')        fmt.Println(msg)        if err != nil {            quitSemaphore <- true            break        }        time.Sleep(time.Second)        b := []byte(msg)        conn.Write(b)    }}

編譯客戶端:

go build client.go

最后, 開啟兩個終端, 分別運行server和client

可以看到以下類似的輸出:

connected!2015-03-19 23:42:08.4875559 +0800 CST

2015-03-19 23:42:09.4896132 +0800 CST

2015-03-19 23:42:10.4906704 +0800 CST

2015-03-19 23:42:11.4917277 +0800 CST

2015-03-19 23:42:12.4927849 +0800 CST

2015-03-19 23:42:13.4938422 +0800 CST

2015-03-19 23:42:14.4948995 +0800 CST

2015-03-19 23:42:15.4959567 +0800 CST

2015-03-19 23:42:16.497014 +0800 CST

2015-03-19 23:42:17.4980712 +0800 CST

2015-03-19 23:42:18.4991285 +0800 CST

2015-03-19 23:42:19.5001857 +0800 CST

這樣, 一個簡單的echo服務器/客戶端就實現(xiàn)了

動手實踐是學習 IT 技術最有效的方式! 開始實驗
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Golang開發(fā)支持平滑升級(優(yōu)雅重啟)的HTTP服務(轉(zhuǎn))
HTTP 協(xié)議 與 golang web 應用服務
go語言系列-TCP編程
RabbitMQ Golang教程(二)
手把手教你用Go語言打造一款簡易TCP端口掃描器
【Go語言入門100題】036 A乘以B (5 分) Go語言|Golang
更多類似文章 >>
生活服務
熱點新聞
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服