go的并发时钟

2020-05-03  本文已影响0人  蛐蛐儿阳

笔记是为了多敲一遍代码,加深理解。直接上代码 A

package main

import (
    "io"
    "log"
    "net"
    "time"
)

func main()  {
    listener, err := net.Listen("tcp", "localhost:8000")
    if err != nil {
        log.Fatal(err)
    }

    for  {
        conn, err := listener.Accept()
        if err != nil {
            log.Print(err)
            continue
        }
        handleConn(conn)
    }
}

func handleConn(c net.Conn)  {
    defer c.Close()
    for  {
        _, err := io.WriteString(c, time.Now().Format("15:04:05 \n"))
        if err != nil {
            return
        }
        time.Sleep(1 * time.Second)
    }
}

时间函数的一些知识

fmt.Println(time.Now().Unix())
# 1389058332
这个比较亲切

fmt.Println(time.Now().Format("2006-01-02 15:04:05")) 
# 这是个奇葩,必须是这个时间点, 据说是go诞生之日, 记忆方法:6-1-2-3-4-5
# 2014-01-07 09:42:20

然后
net.Listen 监听可访问接口, 发送数据
net.Dial dial是拨号的意思, 接收数据
看下接收代码 B

package main

import (
    "io"
    "log"
    "net"
    "os"
)

func main()  {
    conn, err := net.Dial("tcp", "localhost:8000")
    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)
    }
}

意思是A先开启,在开启B, B会接收到时间,每秒一条不断打印。但开启多个B, 只有第一个b能接收到信息, 其他等待。 当第一个B挂掉,第二个开始接收信息,以此类推。即只能有一个,非并发。
服务器支持并发是理所当然的,我们现在看看怎么搞。
在消息发送端, handleConn 函数前添加 go 即可。

就不再贴代码了,这里每一个连接使用一个 go。
下一pa

上一篇 下一篇

猜你喜欢

热点阅读