基于服务器一次处理多个客户端的连接,且各客户端之间保持独立的场景进行编写实例。
使用net包构建客户端与服务器间通信。
定期报告时间的tcp服务器
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("2006-01-02 15:04:05 MST Mon\n")) if err != nil { return } time.Sleep(1 * time.Second) } }
只读的tcp客户端程序
当前客户端需等待前一个客户端断开连接,才能读到服务器的时间。
由服务器顺序处理客户请求。
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) } }
当前采用多个客户端进行连接时,只有一个得到响应,如图:
只有前面的客户端断开连接,等待的客户端请求才会被处理,如图:
实现服务器支持并发的改变
在调用handleConn处添加go关键字,使它在自己的goroutine中执行。