server.go
package main
import (
"io"
"log"
"net"
"time"
)
func main() {
//监听一个端口
listener, err := net.Listen("tcp", "localhost:8000") //监听8000
if err !=nil{
log.Fatal("it is good") //1、打印输出内容 2、退出应用程序 3、defer函数不会执行
}
if err != nil {
log.Fatal(err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Print(err) // connection aborted
continue
}
go handleConn(conn) // handle one connection at a time
//没加go的时候,剩下多一个client会阻塞
}
}
func handleConn(c net.Conn) {
defer c.Close()
for {
_, err := io.WriteString(c, "hello")
if err != nil {
return // client disconnected
}
time.Sleep(1 * time.Second)
}
}
client.go
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)
}
//io.Copy,当src里有内容的时候,丢到dst中
func mustCopy(dst io.Writer, src io.Reader) {
if _, err := io.Copy(dst, src); err != nil {
log.Fatal(err)
}
}
server不用go关键字时,cilent一次连一个,shell开两个,后一个会等第一个挂掉才连接。