Fiber WebSocket Örneği
Fiber'ın Fasthttp WebSocket bileşeni üzerinde çalıştığı, *fiber.Ctx
yönteminin Locals, Params, Query ve Cookies gibi kullanıldığı bir örnektir. İşte Fiber'da WebSocket kullanımına dair bir örnek.
Not: Go sürümü 1.18 ve üzeri gereklidir.
Kurulum
go get -u github.com/gofiber/fiber/v2
go get -u github.com/gofiber/contrib/websocket
Fonksiyon İmzası
func New(handler func(*websocket.Conn), config ...websocket.Config) fiber.Handler {
Yapılandırma
Özellik | Tür | Açıklama | Varsayılan Değer |
---|---|---|---|
Filtre | func(*fiber.Ctx) bool |
Ara yazılımı atlamak için bir işlev tanımlar. | nil |
HandshakeTimeout | time.Duration |
HandshakeTimeout, el sıkışmayı tamamlamak için süreyi belirtir. | 0 (zaman sınırlaması yok) |
Altprotokoller | []string |
Altprotokoller, istemcinin istediği altprotokolleri belirtir. | nil |
Kaynaklar | []string |
Origin başlığına göre izin verilen kökenler. Boşsa, herhangi bir kökene izin verir. | nil |
OkumaArabellekBoyutu | int |
OkumaArabellekBoyutu, iletilerin alınması için G/Ç arabelleği boyutunu belirtir (byte cinsinden). | 0 (varsayılan boyut) |
YazmaArabellekBoyutu | int |
YazmaArabellekBoyutu, iletilerin gönderilmesi için G/Ç arabelleği boyutunu belirtir (byte cinsinden). | 0 (varsayılan boyut) |
YazmaArabellekHavuzu | websocket.BufferPool |
YazmaArabellekHavuzu, yazma işlemleri için kullanılan arabellek havuzu. | nil |
SıkıştırmayıEtkinleştir | bool |
SıkıştırmayıEtkinleştir, istemcinin her ileti için sıkıştırma müzakere etmesinin belirtilmesini sağlar (RFC 7692). | false |
Kurtarmaİşleyicisi | func(*websocket.Conn) void |
Kurtarmaİşleyicisi, bir panik durumundan kurtulmak için bir işleme işlevidir. | defaultRecover |
Örnek
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/contrib/websocket"
)
func main() {
app := fiber.New()
app.Use("/ws", func(c *fiber.Ctx) error {
// İstemcinin WebSocket protokolüne yükseltme isteyip istemediğini kontrol eder
if websocket.IsWebSocketUpgrade(c) {
c.Locals("allowed", true)
return c.Next()
}
return fiber.ErrUpgradeRequired
})
app.Get("/ws/:id", websocket.New(func(c *websocket.Conn) {
// c.Locals, *websocket.Conn'e eklenir
log.Println(c.Locals("allowed")) // true
log.Println(c.Params("id")) // 123
log.Println(c.Query("v")) // 1.0
log.Println(c.Cookies("session")) // ""
var (
mt int
msg []byte
err error
)
for {
if mt, msg, err = c.ReadMessage(); err != nil {
log.Println("read:", err)
break
}
log.Printf("recv: %s", msg)
if err = c.WriteMessage(mt, msg); err != nil {
log.Println("write:", err)
break
}
}
}))
log.Fatal(app.Listen(":3000"))
// WebSocket sunucusuna erişim: ws://localhost:3000/ws/123?v=1.0
// https://www.websocket.org/echo.html
}
Ön Bellek Ara Yazılımı Kullanımı Notları
Önbellek ara yazılımı kullanırken websocket: bad handshake
hatası ile karşılaşırsanız, WebSocket yolunu atlamak için config.Next
kullanın.
app := fiber.New()
app.Use(cache.New(cache.Config{
Next: func(c *fiber.Ctx) bool {
return strings.Contains(c.Route().Path, "/ws")
},
}))
app.Get("/ws/:id", websocket.New(func(c *websocket.Conn) {}))
Kurtarma ara yazılımını kullanma hususunda dikkate alınması gerekenler
Dahili uygulama nedenleriyle, kurtarma ara yazılımı şu anda WebSocket ara yazılımıyla uyumsuzdur. Lütfen WebSocket uç noktaları için bir kurtarma işleyicisi eklemek için config.RecoverHandler
kullanın. Varsayılan olarak, RecoverHandler
yapılandırması kaçınma durumlarını iyileştirir, stack izini stderr'e yazar ve ayrıca error alanında panik mesajını içeren bir yanıt döndürür.
app := fiber.New()
app.Use(cache.New(cache.Config{
Next: func(c *fiber.Ctx) bool {
return strings.Contains(c.Route().Path, "/ws")
},
}))
cfg := Config{
RecoverHandler: func(conn *Conn) {
if err := recover(); err != nil {
conn.WriteJSON(fiber.Map{"customError": "hata oluştu"})
}
},
}
app.Get("/ws/:id", websocket.New(func(c *websocket.Conn) {}, cfg))