Go语言圣经–示例: 并发的Clock服务习题详解编程语言

练习 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 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) 
        }    
} 

Go语言圣经--示例: 并发的Clock服务习题详解编程语言  

  

 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/12532.html

(0)
上一篇 2021年7月19日 14:43
下一篇 2021年7月19日 14:43

相关推荐

发表回复

登录后才能评论