在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
练习 8.1: 修改clock2来支持传入参数作为端口号,然后写一个clockwall的程序,这个程序可以同时与多个clock服务器通信,从多服务器中读取时间,并且在一个表格中一次显示所有服务传回的结果,类似于你在某些办公室里看到的时钟墙。如果你有地理学上分布式的服务器可以用的话,让这些服务器跑在不同的机器上面;或者在同一台机器上跑多个不同的实例,这些实例监听不同的端口,假装自己在不同的时区。像下面这样:
clock2.go package main import ( "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 main import ( "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) } }
|
请发表评论