科普
长连接,也被称为持久连接,是对同一个服务器的多次请求,使用相同的TCP连接来发送。这与短连接(每一个请求建立一个新的TCP连接)形成对比。长连接可以减少建立和关闭连接的时间开销,提升网络通信效率。
例如在HTTP/1.1中,默认就是采用长连接的方式,大大提高了web页面的加载速度。客户端和服务器之间建立的TCP连接在传输完数据之后并不立即断开,而是可以继续被用来传输之后的数据。
长连接特别适用于需要频繁通信或实时交互的场景,例如数据库连接、消息推送、Websocket通信等。
如何实现长连接
1、HTTP长连接
HTTP长连接:在HTTP1.1中,默认都是长连接,也就是Connection: keep-alive。Go的net/http包默认也支持这个,所以你不需要做任何设置。
示例代码:
http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
// 处理逻辑
fmt.Fprintf(w, "This is a persistent connection")
})
http.ListenAndServe(":8080", nil)
客户端可以复用连接多次进行请求,节省了创建和关闭连接的开销。
WebSocket提供了一种在单个TCP连接上进行全双工通讯的协议。Go语言中的gorilla/websocket库可以用来处理WebSocket连接。
下面我来用websocket技术来实现一个简单的聊天室功能
安装扩展库
go get github.com/gorilla/websocket
下面是服务端的代码
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func handler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
for {
messageType, message, err := conn.ReadMessage()
if err != nil {
log.Println(err)
return
}
log.Println(string(message))
var amessage = "返回内容是"+string(message)
if err = conn.WriteMessage(messageType, []byte(amessage)); err != nil {
log.Println(err)
return
}
}
}
func main() {
http.HandleFunc("/", handler)
fmt.Println("server starting on localhost:8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
这个简单的聊天室将任何从客户端接收到的消息都发回到客户端。
然后,需要创建一个 Web 页面作为客户端页面,与 WebSocket 服务器通信:
<html>
<head>
<title>WebSocket Demo</title>
</head>
<body>
<textarea id="chat" cols="30" rows="10"></textarea>
<br/>
<input id="input" type="text"/>
<button onclick="sendMsg()">发送</button>
<script>
let socket = new WebSocket("ws://localhost:8080");
socket.onmessage = function(event) {
document.getElementById('chat').value += event.data + '\n'
};
function sendMsg() {
let msg = document.getElementById('input').value;
socket.send(msg);
document.getElementById('input').value = '';
}
</script>
</body>
</html>
在这个简单的示例里,任何在文本框中输入的消息都会被发送到服务器,然后服务器将相同的消息添加额外处理然后发送回来并显示在屏幕上。