client and server
client1 _
\
tcp
\ --------
client2 -tcp-- | server |
/ --------
tcp
client3 _/
服务器处理流程
/
------------
| Listen port |
------------
|
|
\|/
---------------------
| Accept client data |
--------------------
|
|
\|/
-------------------
| start goroutine |
------------------
- 端口监听
- 接收客户端数据
- 启动goroutine 处理该链接
客户端处理流程
/
--------------
| start connect |
--------------
|
|
\|/
---------------------
| receive/send data |
--------------------
|
|
\|/
-----------------
| close connect |
-----------------
- 建立服务器连接
- 进行数据收发
- 关闭连接
create tcp server
// sockt-server/main.go
package main
import (
"fmt"
"net"
)
func process(conn net.Conn) {
defer conn.Close()
for {
buf := make([]byte, 512)
_, err := conn.Read(buf)
if err != nil {
fmt.Println("read failed, err:", err)
return
}
fmt.Println("read data:", string(buf))
}
}
func server() {
fmt.Println("start server...")
listen, err := net.Listen("tcp", "0.0.0.0:5000")
if err != nil {
fmt.Println("listen failed, err:", err)
return
}
for {
conn, err := listen.Accept()
if err != nil {
fmt.Println("acceopt failed, err:", err)
return
}
go process(conn)
}
}
func main() {
server()
}
编译并运行
$ go build go_dev/day9/exercises/sockt-server
$ ./sockt-server
create tcp client
// sockt-client/main.go
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func client() {
conn, err := net.Dial("tcp", "127.0.0.1:5000")
if err != nil {
fmt.Println("error dialing, err:", err)
return
}
defer conn.Close()
inputReader := bufio.NewReader(os.Stdin)
for {
input, _ := inputReader.ReadString('\n')
trimmedInput := strings.Trim(input, "\r\n")
if trimmedInput == "q" {
return
}
_, err = conn.Write([]byte(trimmedInput))
if err != nil {
fmt.Println("sockt write failed, err:", err)
return
}
}
}
func main() {
client()
}
编译并运行
$ go build go_dev/day9/exercises/sockt-client
$ ./sockt-client
你输入什么信息,服务端就会打出什么信息,