什么是长连接和短连接?
短连接(Short Connections)
短连接是指客户端与服务器之间的连接在完成一次请求-响应后即被关闭的方式。每次需要通信时,客户端都会重新建立一个新的连接。
特点:
- 连接时间短:每次请求完成后立即关闭连接。
- 资源消耗低:由于连接时间短,服务器资源释放快。
- 适用场景:适用于请求频率较低或对实时性要求不高的应用。
长连接(Long Connections)
长连接指客户端与服务器之间的连接在完成一次请求-响应后不会立即关闭,而是保持连接状态,以便后续的通信可以复用同一个连接。
特点:
- 连接时间长:连接在多个请求-响应之间保持开放状态。
- 资源消耗较高:需要维持连接的状态,可能占用更多服务器资源。
- 适用场景:适用于需要频繁通信或实时性要求较高的应用,如聊天应用、实时数据推送等。
在Go中实现长连接和短连接
实现短连接
使用Go的net/http包,可以轻松实现一个处理短连接的HTTP服务器。默认情况下,HTTP服务器使用短连接,除非客户端和服务器协商使用持久连接(Keep-Alive)。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "这是一个短连接响应")
}
func main() {
http.HandleFunc("/", handler)
fmt.Println("短连接服务器运行在端口8080")
http.ListenAndServe(":8080", nil)
}
实现长连接
WebSocket是一种在单个TCP连接上进行全双工通信的协议,非常适合实现实时应用,如聊天系统、实时数据推送等。
服务端代码
package main
import (
"fmt"
"log"
"net/http"
"time"
"github.com/gorilla/websocket"
)
// 升级 HTTP 到 WebSocket 的工具
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
// 允许所有跨域
return true
},
}
// WebSocket 连接处理
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
// 升级为 WebSocket
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("升级失败:", err)
return
}
defer conn.Close()
log.Println("新客户端连接")
// 启动一个定时推送消息的 goroutine
go func() {
for {
time.Sleep(10 * time.Second)
err := conn.WriteMessage(websocket.TextMessage, []byte("服务端定时推送消息"))
if err != nil {
log.Println("推送失败:", err)
return
}
}
}()
// 处理客户端发送的消息
for {
msgType, msg, err := conn.ReadMessage()
if err != nil {
log.Println("读取失败:", err)
break
}
log.Printf("收到消息: %sn", msg)
// 回复客户端
reply := fmt.Sprintf("你发送的是: %s", msg)
err = conn.WriteMessage(msgType, []byte(reply))
if err != nil {
log.Println("回复失败:", err)
break
}
}
}
func main() {
http.HandleFunc("/ws", handleWebSocket)
addr := ":8080"
log.Printf("WebSocket 服务启动,监听地址 %s/ws", addr)
log.Fatal(http.ListenAndServe(addr, nil))
}
使用JavaScript连接WebSocket
<!DOCTYPE html>
<html>
<head>
<title>WebSocket 测试</title>
</head>
<body>
<script>
const ws = new WebSocket("ws://localhost:8080/ws");
ws.onopen = () => {
console.log("WebSocket 连接已打开");
ws.send("Hello, 服务器!");
};
ws.onmessage = (event) => {
console.log("收到服务器消息:", event.data);
};
ws.onclose = () => {
console.log("WebSocket 连接已关闭");
};
</script>
</body>
</html>
说明:
- 服务器通过
Gorilla WebSocket库升级HTTP连接为WebSocket连接。 - 建立连接后,客户端和服务器可以在同一个连接上进行双向通信。
- 适用于需要实时数据传输的应用场景。



