[日常] Go語言聖經--樣本: 並發的Clock服務習題

來源:互聯網
上載者:User

標籤:讀取   err   test   程式   並發   並且   cte   for   listen   

練習 8.1: 修改clock2來支援傳入參數作為連接埠號碼,然後寫一個clockwall的程式,這個程式可以同時與多個clock伺服器通訊,從多伺服器中讀取時間,並且在一個表格中一次顯示所有服務傳回的結果,類似於你在某些辦公室裡看到的時鐘牆。如果你有地理學上分布式的伺服器可以用的話,讓這些伺服器跑在不同的機器上面;或者在同一台機器上跑多個不同的執行個體,這些執行個體監聽不同的連接埠,假裝自己在不同的時區。像下面這樣:

$ TZ=US/Eastern    ./clock2 -port 8010 &$ TZ=Asia/Tokyo    ./clock2 -port 8020 &$ TZ=Europe/London ./clock2 -port 8030 &$ clockwall NewYork=localhost:8010 Tokyo=localhost:8020 London=localhost:8030

clock2.go

package mainimport (        "flag"        "io"        "log"        "net"        "time")//支援傳入參數作為連接埠號碼var port = flag.String("port", "8000", "請輸入連接埠")func main() {        flag.Parse()        listener, err := net.Listen("tcp", "localhost:"+*port)        if err != nil {                log.Fatal(err)        }           for {                conn, err := listener.Accept()                if err != nil {                        log.Print(err) // e.g., connection aborted                        continue                }                   go handleConn(conn) //建立goroutines處理串連        }   }func handleConn(c net.Conn) {        defer c.Close()        for {                _, err := io.WriteString(c, time.Now().Format("15:04:05\n"))                if err != nil {                        return // e.g., client disconnected                }                   time.Sleep(1 * time.Second)        }   }

clockwall.go

// Netcat1 is a read-only TCP client.package mainimport (        "io"        "log"        "net"        "os"        "strings"        "time")func main() {        for _, v := range os.Args[1:] {                keyValue := strings.Split(v, "=")                go connTcp(keyValue[1])        }           for {                time.Sleep(1 * time.Second)        }   }func connTcp(uri string) {        conn, err := net.Dial("tcp", uri)        if err != nil {                log.Fatal(err)        }           defer conn.Close()        mustCopy(os.Stdout, conn)}func mustCopy(dst io.Writer, src io.Reader) {        if _, err := io.Copy(dst, src); err != nil {                log.Fatal(err)        }   }

  

  

 

[日常] Go語言聖經--樣本: 並發的Clock服務習題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.