加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[日常] Go语言圣经--示例: 并发的Clock服务习题

发布时间:2020-12-16 19:36:23 所属栏目:大数据 来源:网络整理
导读:练习 8.1:?修改clock2来支持传入参数作为端口号,然后写一个clockwall的程序,这个程序可以同时与多个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

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:05n"))
if err != nil {
return // e.g.,client disconnected
}
time.Sleep(1 * time.Second)
}
}

clockwall.go

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

  

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读