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))