使用 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))
}
}