標籤:讀取 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服務習題