笔记是为了多敲一遍代码,加深理解。直接上代码 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
网友评论