博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[日常] Go语言圣经--示例: 并发的Clock服务习题
阅读量:6828 次
发布时间:2019-06-26

本文共 2067 字,大约阅读时间需要 6 分钟。

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

  

  

 

转载于:https://www.cnblogs.com/taoshihan/p/8955365.html

你可能感兴趣的文章
setprecision **fixed
查看>>
JVM系列五:JVM监测&工具[整理中]
查看>>
局部自适应自动色阶/对比度算法在图像增强上的应用。
查看>>
CMD命令
查看>>
Spring中@Autowired与@Resource的区别
查看>>
Python 学习笔记 -- 类和实例
查看>>
Android 静默安装/后台安装
查看>>
java 非空判断类
查看>>
【html5】如何让Canvas标签自适应设备
查看>>
SecureCRT最佳配色方法+直接修改默认配置方法 - imsoft.cnblogs
查看>>
通俗地介绍下---数据结构之堆
查看>>
JQuery实现简单的服务器轮询效果
查看>>
2017.6.26 工作记录
查看>>
“Too many open files” 小记
查看>>
tomcat报错
查看>>
【xamarin + MvvmCross 从零开始】八、Android Fragment 的使用
查看>>
TOJ 3046: 招商银行网络系统
查看>>
java8_api_正则表达式
查看>>
java匿名对象
查看>>
RichTextBox.MouseWheel事件控制父控件Panel的内容滚动
查看>>