使用 net 包网络通信的功能,构建 tcp 服务器,它包含了处理 TCP/IP 以及 UDP 协议、域名解析等方法。

注意需要先启动服务端再启动客户端,客户端可以启用多个。

服务端: server.go

package main

import (
	"fmt"
	"net"
)

func main() {
	fmt.Println("Starting the server ...")
	// 创建 listener
	listener, err := net.Listen("tcp", "localhost:50000")
	if err != nil {
		fmt.Println("Error lisening", err.Error())
		return
	}
	for {
		// 接受客户端信息
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Err accepting", err.Error())
			return
		}
		// 处理客户端连接
		go doServerStuff(conn) 
	}
}

func doServerStuff(conn net.Conn) {
	for {
		buff := make([] byte, 512)
		// 读取客户端信息
		len, err := conn.Read(buff)
		if err != nil {
			fmt.Println("Err reading", err.Error())
			return
		}
		fmt.Printf("Received data: %v\n", string(buff[:len]))  
	}
}

客户端:client.go

package main

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

func main() {
	// 链接 tcp 服务端
	conn, err := net.Dial("tcp", "localhost:50000")
	if err != nil {
		fmt.Println("Error dialing", err.Error())
		return
	}
	// 先定义自己的名字
	inputReader := bufio.NewReader(os.Stdin)
	fmt.Println("First, what is your name ?")
	clintName, _ := inputReader.ReadString('\n')
	trimmedClient := strings.Trim(clintName, "\r\n")
	for {
		fmt.Println("What to send to server? Type Q to quit.")
		// 获取输入字段
		input, _ := inputReader.ReadString('\n')
		trimmedInput := strings.Trim(input, "\r\n")
		if trimmedInput == "Q" {
			return
		}
		// 发送数据给服务端
		_, err = conn.Write([]byte(trimmedClient + " says: " + trimmedInput))
	}
}