// 模拟客户端发送消息
package main
import (
"log"
"time"
"github.com/gorilla/websocket"
)
func main() {
// 客户端建立与websocket连接
conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
// 发送消息到服务端
message := []byte("123456")
if err := conn.WriteMessage(websocket.TextMessage, message); err != nil {
log.Fatal(err)
}
// 设置读取服务端push消息超时时间
conn.SetReadDeadline(time.Now().Add(60 * time.Second))
// 循环读取消息
for {
_, p, err := conn.ReadMessage()
if err != nil {
log.Fatal(err)
}
log.Println(err)
log.Println(string(p))
}
}
package main
import (
"fmt"
"log"
"net/http"
"strconv"
"time"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func main() {
// 创建websocket 地址及监听端口
http.HandleFunc("/", home)
http.HandleFunc("/ws", wsEndpoint)
log.Println("Server started on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
func home(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "WebSocket Server")
}
func wsEndpoint(w http.ResponseWriter, r *http.Request) {
/*
在Gorilla Websocket库中,使用upgrader.Upgrade(w, r, nil)方法将HTTP连接升级为Websocket连接,
其中w是一个http.ResponseWriter对象,r是一个*http.Request对象,nil表示不需要额外的头部信息。
upgrader.Upgrade方法返回两个值,分别是*websocket.Conn对象和error对象。
*websocket.Conn对象表示Websocket连接,可以通过这个对象进行消息的发送和接收。
error对象表示升级过程中是否出现了错误,如果出现错误,可以通过error对象获取错误信息
*/
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
}
log.Println("Client Connected")
// 设置读取客户端消息超时时间
conn.SetReadDeadline(time.Now().Add(30 * time.Second))
messageType, p, err := conn.ReadMessage()
log.Println(p)
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
log.Printf("error: %v", err)
}
return
}
if messageType == websocket.TextMessage {
// 将接收到的字符串消息解析为整数
num, err := strconv.Atoi(string(p))
log.Println(num)
if err != nil {
log.Println(err)
return
}
// 设置发送客户端消息超时时间
conn.SetWriteDeadline(time.Now().Add(30 * time.Second))
for i := 1; i <= 10; i++ {
err = conn.WriteMessage(websocket.TextMessage, []byte(fmt.Sprintf("%d", i)))
if err != nil {
log.Println(err)
return
}
// 暂停1秒钟
time.Sleep(time.Second)
// 如果达到指定次数,则退出循环
if i == num {
break
}
}
}
}
go 实现websocket 通信
最新推荐文章于 2024-05-12 16:54:31 发布