Golang高并发教程之 TCP时钟服务器
2019-06-15 本文已影响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的全部的方法。