网络编程的程序员,最基本的前后端tcp通讯框架要懂
服务器文件:server.go
package mainimport ( "fmt" "net")func main() { fmt.Println("Starting the server") // create listener listener, err := net.Listen("tcp", "localhost:8001") if err != nil{ fmt.Println("Error listening", err.Error()) return } //listen and receive client's connection for { conn, err := listener.Accept() if err != nil{ fmt.Println("Error accepting", err.Error()) return } go doServerStuff(conn) }}func doServerStuff(conn net.Conn) { for { buf := make([]byte, 512) _, err := conn.Read(buf) if err != nil{ fmt.Println("Error reading", err.Error()) return // stop } fmt.Printf("Received data : %v", string(buf)) }}
客户端文件:client.go
package mainimport ( "net" "fmt" "bufio" "os" "strings")func main() { 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?") clientName, _ := inputReader.ReadString('\n') //fmt.Printf("CLIENTNAME %s", clientName) trimmedClient := strings.Trim(clientName, "\r\n") for { fmt.Println("What to send to the 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)) }}
so easy!
PS:
我们在 main() 创建了一个 net.Listener 的变量,他是一个服务器的基本函数:用来监听和接收来自客户
端的请求(来自localhost即IP地址为127.0.0.1端口为50000基于TCP协议)。这个 Listen() 函数可以返回一个 error 类型的错误变量。用一个无限for循环的 listener.Accept() 来等待客户端的请求。客户端的请求将产生一个 net.Conn 类型的连接变量。然后一个独立的携程使用这个连接执行 doServerStuff() ,开始使用一个512字节的缓冲 data 来读取客户端发送来的数据并且把它们打印到服务器的终端;当客户端发送的所有数据都被读取完成时,携程就结束了。这段程序会为每一个客户端连接创建一个独立的携程。必须先运行服务器代码,再运行客户端代码。