Golang高并发教程之 TCP时钟服务器

作者: 我加入简书的路程 | 来源:发表于2019-06-15 11:18 被阅读1次

    示例:TCP时钟服务器

    package main
    
    import (
        "io"
        "log"
        "net"
        "time"
    )
    
    func main() {
        listenner,err:=net.Listen("tcp","localhost:8000")
        if err != nil {
            log.Fatal(err)
        }
        for  {
            conn,err := listenner.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)
        }
    }
    

    之后使用nc(netcat)连接tcp服务器

     nc localhost 8000
    

    返回结果

    catdeiMac:mysql cat$ nc localhost 8000
    11:12:25
    11:12:26
    11:12:27
    11:12:28
    11:12:29
    11:12:30
    

    分析

    服务器分析

    • net.Listen创建一个tcp服务器listenner
    • listenner.Accept()监听客户端请求产生连接conn
    • 使用外部函数handleConn处理连接conn

    外部函数分析

    • io.WriteString(c,time.Now().Format("15:04:05\n"))

    本教程用到的源代码

    func WriteString(w Writer, s string) (n int, err error) {
        if sw, ok := w.(StringWriter); ok {
            return sw.WriteString(s)
        }
        return w.Write([]byte(s))
    }
    
    type Writer interface {
        Write(p []byte) (n int, err error)//实现了方法
    }
    type Conn interface {
        Read(b []byte) (n int, err error)
        Write(b []byte) (n int, err error)//实现了方法
        Close() error
        LocalAddr() Addr
        RemoteAddr() Addr
        SetDeadline(t time.Time) error
        SetReadDeadline(t time.Time) error
        SetWriteDeadline(t time.Time) error
    }
    

    这里的c之所以能够作为 func WriteString 的参数,是因为Conn实现了Writer的全部的方法。

    相关文章

      网友评论

        本文标题:Golang高并发教程之 TCP时钟服务器

        本文链接:https://www.haomeiwen.com/subject/fwovfctx.html