Http 和 websocket
HTTP 和 WebSocket 是现代 Web 应用中最常用的协议之一。HTTP 是用于在客户端和服务器之间传输数据的标准协议,而 WebSocket 则是一种全双工协议,允许在客户端和服务器之间进行实时通信。本文将介绍 Golang 中如何使用 HTTP 和 WebSocket,以及如何将 WebSocket 应用于分布式实时应用中。
HTTP
在 Golang 中,可以使用内置的 net/http 包来创建 HTTP 服务器和客户端。下面是一个简单的 HTTP 服务器示例:
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
在这个例子中,我们使用 http.HandleFunc() 函数将 / 路径与 handler 函数关联起来。handler 函数接收两个参数,一个 http.ResponseWriter 和一个 *http.Request。http.ResponseWriter 是用于向客户端发送响应的接口,而 *http.Request 则包含客户端请求的信息,例如 HTTP 方法、路径和头部信息等。在 handler 函数中,我们使用 fmt.Fprintf() 函数将 Hello, World! 响应发送回客户端。
启动这个 HTTP 服务器非常简单,只需要在命令行中执行:
go run main.go
然后访问 http://localhost:8080/ 即可看到响应。
WebSocket
WebSocket 是一种基于 TCP 协议的全双工通信协议。与 HTTP 不同,WebSocket 不需要通过轮询来实现实时通信。相反,它允许客户端和服务器之间建立一个持久性的连接,并通过这个连接进行双向通信。
在 Golang 中,可以使用 gorilla/websocket 包来实现 WebSocket。下面是一个简单的 WebSocket 服务器示例:
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func handler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer conn.Close()
for {
messageType, message, err := conn.ReadMessage()
if err != nil {
log.Println(err)
break
}
log.Printf("Received message: %s\n", message)
err = conn.WriteMessage(messageType, message)
if err != nil {
log.Println(err)
break
}
}
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
在这个例子中,我们使用 github.com/gorilla/websocket 包中的 Upgrader 结构体来将 HTTP 连接升级为 WebSocket 连接。在 handler 函数中,我们使用 upgrader.Upgrade() 方法将 HTTP 连接升级为 WebSocket 连接。然后,我们进入一个无限循环,不断读取客户端发送的消息,并将它们发送回客户端。要发送消息,我们使用 conn.WriteMessage() 方法,它接收两个参数:消息类型和消息内容。在本例中,我们将消息类型设置为与接收到的消息类型相同。
启动这个 WebSocket 服务器也非常简单,只需要在命令行中执行:
go run main.go
然后使用 WebSocket 客户端连接到 ws://localhost:8080/ 即可进行双向通信。下面是一个简单的 JavaScript WebSocket 客户端示例:
const socket = new WebSocket('ws://localhost:8080/');
socket.addEventListener('open', event => {
console.log('WebSocket connected');
socket.send('Hello, WebSocket!');
});
socket.addEventListener('message', event => {
console.log(`Received message: ${event.data}`);
});
socket.addEventListener('close', event => {
console.log('WebSocket disconnected');
});
在这个例子中,我们使用 WebSocket 类创建一个 WebSocket 连接。当连接成功建立时,open 事件将触发,并向服务器发送一条消息。当接收到消息时,message 事件将触发,并将消息内容打印到控制台。当连接关闭时,close 事件将触发。