网络编程
Go语言内置了对TCP/IP、HTTP、WebSocket等常见网络协议的支持,同时也提供了灵活的函数和包,使得网络编程变得非常简单和高效。
```package main
import (
"fmt"
"net"
)
func main() {
fmt.Println("Starting server...")
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error starting server:", err)
return
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting connection:", err)
continue
}
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
buffer := make([]byte, 1024)
for {
n, err := conn.Read(buffer)
if err != nil {
fmt.Println("Error reading data:", err)
return
}
if n == 0 {
break
}
fmt.Println("Received data:", string(buffer[:n]))
conn.Write([]byte("Message received."))
}
}
客户端程序:
```package main
import (
"fmt"
"net"
)
func main() {
fmt.Println("Starting client...")
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
fmt.Println("Error connecting to server:", err)
return
}
defer conn.Close()
message := []byte("Hello, server.")
conn.Write(message)
buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
fmt.Println("Error reading data:", err)
return
}
fmt.Println("Received data:", string(buffer[:n]))
}
上述代码中,服务器在端口8080上监听着所有传入的TCP连接,并在接收到连接请求后启动一个新的Goroutine来处理该连接。handleConnection函数用来处理具体的连接逻辑,它接收一个net.Conn参数,从该连接中读取数据,并将接收到的信息回显给客户端。客户端程序连接上服务器,并发送一条消息Hello, server.,然后等待服务器回复,并打印回复结果。
部署
Go语言的部署非常简单和方便,具体可以通过以下方式进行部署:
- 生成可执行文件
使用go build命令,可以将Go源代码编译成本地可执行文件,例如:
go build main.go
这将生成一个名为main的可执行文件。
- 打包成Docker镜像
使用Docker可以将应用程序部署到容器中,并进行快速启动和运行。可以通过以下方式将Go应用程序打包成Docker镜像:
- 创建一个名为Dockerfile的文件,文件中指定了使用哪个镜像,如何打包、安装以及运行应用程序,例如:
- FROM golang:alpine3.14 WORKDIR /app COPY main.go . RUN go mod init RUN go build -o /app/main . EXPOSE 8080 CMD ["/app/main"]
- 这里使用了Alpine Linux做基础镜像,然后将Go应用程序的源代码拷贝到容器中,并编译成可执行文件。最后将容器监听的端口暴露出来,并指定了容器启动时运行的命令。