Beispiele¶
Sammlung vollständiger und funktionaler Beispiele zum Erlernen der Verwendung des Socket.IO-Clients in Go.
🚀 Schnellstart¶
Alle Beispiele können mit einem einzigen Befehl ausgeführt werden:
📚 Verfügbare Beispiele¶
1. Basic - Grundlegende Verbindung¶
Speicherort: examples/basic/
Einfaches Beispiel für Verbindung, Senden und Empfangen von Ereignissen.
Funktionen: - Verbindung zu Socket.IO-Server - Ereignisse an den Server senden - Ereignisse vom Server empfangen - Behandlung von Verbindung und Trennung
Verwendung:
Wichtiger Code:
client := socketio.New("ws://localhost:3000")
client.OnConnect(func() {
client.Emit("hello", "world")
})
client.On("message", func(data ...interface{}) {
fmt.Println("Recibido:", data[0])
})
2. Authentication - JWT-Authentifizierung¶
Speicherort: examples/authentication/
Authentifizierung mit JWT und benutzerdefinierten Headern.
Funktionen: - Authentifizierung mit JWT-Token - Benutzerdefinierte HTTP-Header - Behandlung von Authentifizierungsfehlern - Neuauthentifizierung bei Wiederverbindung
Verwendung:
Wichtiger Code:
client := socketio.New("ws://localhost:3000", socketio.Options{
Auth: map[string]interface{}{
"token": "eyJhbGciOiJIUzI1NiIs...",
},
Headers: map[string]string{
"Authorization": "Bearer token-123",
},
})
3. Binary - Binäre Ereignisse¶
Speicherort: examples/binary/
Übertragung von Dateien und binären Daten.
Funktionen: - Hochladen von Dateien (Bilder, PDFs, etc.) - Herunterladen von Dateien - Streaming binärer Daten - Validierung mit Prüfsummen
Verwendung:
Wichtiger Code:
// Datei lesen und senden
imageData, _ := os.ReadFile("photo.jpg")
client.Of("/").EmitBinary("upload", imageData, map[string]interface{}{
"filename": "photo.jpg",
"size": len(imageData),
})
// Datei empfangen
client.On("file", func(data ...interface{}) {
binaryData := data[0].([]byte)
os.WriteFile("downloaded.jpg", binaryData, 0644)
})
4. Chat - Chat-Anwendung¶
Speicherort: examples/chat/
Echtzeit-Chat mit Räumen und Benutzern.
Funktionen: - Echtzeit-Messaging - Räume (Rooms) - Benutzerbenachrichtigungen (join/leave) - Schreibstatus (Typing)
Verwendung:
Wichtiger Code:
chat := client.Of("/chat")
chat.On("message", func(data ...interface{}) {
user := data[0].(string)
msg := data[1].(string)
fmt.Printf("[%s]: %s\n", user, msg)
})
chat.Emit("join-room", "general")
chat.Emit("message", "juan", "Hola!")
5. Namespaces - Mehrere Namespaces¶
Speicherort: examples/namespaces/
Verwendung mehrerer Namespaces zur logischen Trennung.
Funktionen: - Standard-Namespace (/) - Benutzerdefinierte Namespaces - Nach Namespace isolierte Ereignisse - Unabhängige Verbindungsbehandlung
Verwendung:
Wichtiger Code:
// Standard-Namespace
client.On("global-event", handler)
// Benutzerdefinierte Namespaces
chat := client.Of("/chat")
chat.On("message", chatHandler)
admin := client.Of("/admin")
admin.On("stats", adminHandler)
6. Acknowledgments - Request-Response¶
Speicherort: examples/acknowledgments/
Request-Response-Muster mit Acknowledgments.
Funktionen: - Senden mit Antwort (ACK) - Timeout für Antworten - Behandlung von Server-Antworten - Synchrones Muster über asynchrone Verbindung
Verwendung:
Wichtiger Code:
client.EmitWithAck("get-user", func(response ...interface{}) {
if response == nil {
fmt.Println("Timeout")
return
}
user := response[0].(map[string]interface{})
fmt.Println("Usuario:", user["name"])
}, "user-123")
7. Reconnection - Resiliente Wiederverbindung¶
Speicherort: examples/reconnection/
Erweiterte Behandlung der automatischen Wiederverbindung.
Funktionen: - Automatische Wiederverbindung - Exponentieller Backoff - Status-Resynchronisation - Offline-Warteschlange
Verwendung:
Wichtiger Code:
client := socketio.New("ws://localhost:3000", socketio.Options{
ReconnectAttempts: 10,
ReconnectDelay: time.Second,
ReconnectDelayMax: 5 * time.Second,
})
client.OnReconnectAttempt(func(attempt int) {
fmt.Printf("Intento #%d\n", attempt)
})
client.OnReconnect(func(attempt int) {
// Status resynchronisieren
client.Emit("sync-state", lastState)
})
8. Rooms - Räume und Broadcasting¶
Speicherort: examples/rooms/
Raumsystem für Gruppen-Messaging.
Funktionen: - Räumen beitreten - Räume verlassen - Broadcasting an spezifischen Raum - Mehrere simultane Räume
Verwendung:
Wichtiger Code:
client.Emit("join-room", "sala-general")
client.Emit("join-room", "sala-tech")
client.On("room-message", func(data ...interface{}) {
room := data[0].(string)
msg := data[1].(string)
fmt.Printf("[%s] %s\n", room, msg)
})
client.Emit("message-to-room", "sala-tech", "Hola tech!")
🎓 Nach Schwierigkeitsgrad¶
Einsteiger 🟢¶
Ideal zum Anfangen:
- Basic - Verbindung und grundlegende Ereignisse
- Namespaces - Organisation mit Namespaces
- Rooms - Räume für Gruppen
Mittelstufe 🟡¶
Fortgeschrittenere Muster:
- Authentication - Sicherheit und Authentifizierung
- Acknowledgments - Request-Response-Muster
- Reconnection - Netzwerk-Resilienz
Fortgeschritten 🔴¶
Komplexe Anwendungsfälle:
- Binary - Dateiübertragung
- Chat - Vollständige End-to-End-Anwendung
🛠️ Anforderungen¶
Socket.IO-Server¶
Die meisten Beispiele erfordern einen Socket.IO-Server. Sie können den enthaltenen Testserver oder einen beliebigen Socket.IO v4 Server verwenden.
Option 1: Testserver (Node.js)
# Socket.IO installieren
npm install socket.io
# server.js erstellen
cat > server.js << 'EOF'
const { Server } = require('socket.io');
const io = new Server(3000);
io.on('connection', (socket) => {
console.log('Cliente conectado');
socket.on('hello', (data) => {
console.log('Recibido:', data);
socket.emit('message', 'Echo: ' + data);
});
});
console.log('Servidor Socket.IO escuchando en puerto 3000');
EOF
# Ausführen
node server.js
Option 2: Python-Server
📖 Beispielstruktur¶
Jedes Beispiel enthält:
- README.md - Beispielspezifische Dokumentation
- main.go - Hauptcode
- Kommentare - Detaillierte Erklärungen im Code
🔗 Nützliche Links¶
💡 Tipps¶
Mit Verbose ausführen¶
Mit Race Detector ausführen¶
Server-URL anpassen¶
Die meisten Beispiele erlauben die Konfiguration der URL:
# Umgebungsvariable
SERVER_URL=ws://api.example.com go run .
# Oder Code bearbeiten
const serverURL = "ws://localhost:3000"
🤝 Beitragen¶
Haben Sie ein interessantes Beispiel? Öffnen Sie einen PR oder schlagen Sie eine Idee vor.
📄 Lizenz¶
Alle Beispiele stehen unter der gleichen MIT-Lizenz des Projekts.