zoukankan      html  css  js  c++  java
  • [日常] 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
    "))
                    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)
            }   
    }
    

      

      

  • 相关阅读:
    matlab程序性能优化与混合编程技术介绍
    最大熵原理/最大熵原则/最大熵模型(the maximum entropy principle,MEP)
    马氏距离 Mahalanobis Distance
    时间序列分析
    Windows XP + Apache 2.2.4 + PHP 5.2.0 + MySQL 5.0.27 + Zend Optimizer 3.2.0环境配置方法
    栈应用——表达式求值
    Android实现模拟时钟(简单+漂亮)时针、分针、秒针
    基于循环链表的约瑟夫问题
    assert()详解
    Hadoop HPROF 的使用
  • 原文地址:https://www.cnblogs.com/taoshihan/p/8955365.html
Copyright © 2011-2022 走看看