当涉及到网络编程时,Go 语言的标准库提供了丰富的功能,使得创建网络应用变得相对简单。以下是一个简单的 TCP 服务器和客户端的例子:
服务器端代码:
package main
import (
"fmt"
"net"
)
func main() {
// 启动 TCP 服务器,监听在本地的8888端口
listener, err := net.Listen("tcp", ":8888")
if err != nil {
fmt.Println("Error listening:", err)
return
}
defer listener.Close()
fmt.Println("Server started. Listening on :8888")
for {
// 接收客户端连接
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting connection:", err)
continue
}
fmt.Println("Client connected:", conn.RemoteAddr())
// 处理客户端请求
go handleClient(conn)
}
}
// 处理客户端连接的函数
func handleClient(conn net.Conn) {
defer conn.Close()
// 读取客户端发送的数据
buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
fmt.Println("Error reading:", err)
return
}
fmt.Printf("Received data from client [%s]: %s\n", conn.RemoteAddr(), string(buffer[:n]))
// 发送响应给客户端
conn.Write([]byte("Message received."))
}
客户端代码:
package main
import (
"fmt"
"net"
)
func main() {
// 连接到 TCP 服务器
conn, err := net.Dial("tcp", "localhost:8888")
if err != nil {
fmt.Println("Error connecting:", err)
return
}
defer conn.Close()
// 发送消息给服务器
message := "Hello, server!"
_, err = conn.Write([]byte(message))
if err != nil {
fmt.Println("Error sending message:", err)
return
}
fmt.Println("Message sent to server:", message)
// 接收服务器的响应
buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
fmt.Println("Error receiving response:", err)
return
}
fmt.Println("Response from server:", string(buffer[:n]))
}
在这个例子中,服务器在本地的8888端口监听客户端的连接。一旦有客户端连接进来,服务器会创建一个新的协程来处理该客户端的请求。客户端连接到服务器并发送一条消息,服务器接收到消息后发送一个响应给客户端。