Go开发企业级微服务网关(2)Golang创建 TCP 服务器和客户端

服务端代码如下:

package main

import (
	"fmt"
	"net"
)

func main() {
	// 1 监听端口
	listener, err := net.Listen("tcp", "0.0.0.0:9090")
	if err != nil {
		fmt.Printf("listen fail, err: %v\n", err)
		return
	}

	// 2 建立套接字连接
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Printf("accept fail, err: %v\n", err)
			continue
		}

		// 3 创建处理协程
		go process(conn)
	}
}

func process(conn net.Conn) {
	defer conn.Close()
	for {
		var buf [128]byte
		n, err := conn.Read(buf[:])

		if err != nil {
			fmt.Printf("read from connect failed, err: %v\n", err)
			break
		}
		str := string(buf[:n])
		fmt.Printf("receive from client, data: %v\n", str)
	}
}

客户端代码如下:

package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"strings"
)

func main() {
	// 1 连接服务器
	conn, err := net.Dial("tcp", "localhost:9090")
	defer conn.Close()
	if err != nil {
		fmt.Printf("connect failed, err: %v\n", err.Error())
		return
	}

	// 2 读取命令行输入
	inputReader := bufio.NewReader(os.Stdin)
	for {
		// 3 一直读取直到读到\n
		input, err := inputReader.ReadString('\n')
		if err != nil {
			fmt.Printf("read from console failed, err: %v\n", err)
			break
		}
		// 4 读到 Q 时停止
		trimmedInput := strings.TrimSpace(input)
		if trimmedInput == "Q" {
			break
		}
		// 5 回复服务器消息
		_, err = conn.Write([]byte(trimmedInput))
		if err != nil {
			fmt.Printf("write failed, err: %v\n", err)
			break
		}
	}
}

探讨:如果不执行 conn.Close() 指令的影响

客户端:会导致无法正确释放连接,且连接状态一直是 established,而不是 close_wait (需要依赖链接状态自动探测解决)

服务端:会导致服务端一直处于 close_wait 状态,客户端一直处于 fin_wait_2状态

发表评论