server
package main
import (
"log"
"net"
"time"
)
func main() {
// Part 1: 端口监听
l, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalf("Error listener returned: %s", err)
}
defer l.Close()
// Part 2: 建立连接。
for {
c, err := l.Accept()
//在开启监听成功之后,调用 net.Listener.Accept()方法等待 TCP 连接。
//Accept 方法将以阻塞式地等待新的连接到达,并将该连接作为 net.Conn 接口类型返回。
if err != nil {
log.Fatalf("Error to accept new connection: %s", err)
}
//Part3: 创建协程,数据传输
go func() {
log.Printf("TCP session open")
defer c.Close()
for {
d := make([]byte, 100)
_, err := c.Read(d) // 将数据读到d中
if err != nil {
log.Printf("Error reading TCP session: %s", err)
break
}
log.Printf("reading data from client: %s\n", string(d))
_, err = c.Write(d)
if err != nil {
log.Printf("Error writing TCP session: %s", err)
break
}
}
}()
// part4 强制关闭连接逻辑。启动一个新的 goroutine
go func() {
err := c.(*net.TCPConn).SetLinger(0)
if err != nil {
log.Printf("Error when setting linger: %s", err)
}
<-time.After(time.Duration(10) * time.Second)
defer c.Close()
}()
}
}
client
package main
import (
"log"
"net"
)
func main() {
// Part 1:建立连接
c, err := net.Dial("tcp", "localhost:8000")
if err != nil {
log.Fatalf("Error to open TCP connection: %s", err)
}
defer c.Close()
// Part2: 写入数据
log.Printf("TCP session open")
b := []byte("Hi, gopher?")
_, err = c.Write(b)
if err != nil {
log.Fatalf("Error writing TCP session: %s", err)
}
// Part3: 读取数据
for {
d := make([]byte, 100)
_, err := c.Read(d)
if err != nil {
log.Fatalf("Error reading TCP session: %s", err)
}
log.Printf("reading data from server: %s\n", string(d))
}
}