### JavaScript WebSocket Client for Real-time Chat
Source: https://github.com/gorilla/websocket/blob/main/examples/command/home.html
This JavaScript code implements a WebSocket client to connect to a server, send messages, and display received messages in real-time. It handles connection opening, closing, and message reception. It also includes basic error handling for browsers that do not support WebSockets.
```javascript
window.onload = function () {
var conn;
var msg = document.getElementById("msg");
var log = document.getElementById("log");
function appendLog(item) {
var doScroll = log.scrollTop > log.scrollHeight - log.clientHeight - 1;
log.appendChild(item);
if (doScroll) {
log.scrollTop = log.scrollHeight - log.clientHeight;
}
}
document.getElementById("form").onsubmit = function () {
if (!conn) {
return false;
}
if (!msg.value) {
return false;
}
conn.send(msg.value);
msg.value = "";
return false;
};
if (window["WebSocket"]) {
conn = new WebSocket("ws://" + document.location.host + "/ws");
conn.onclose = function (evt) {
var item = document.createElement("div");
item.innerHTML = "Connection closed.";
appendLog(item);
};
conn.onmessage = function (evt) {
var messages = evt.data.split('\n');
for (var i = 0; i < messages.length; i++) {
var item = document.createElement("div");
item.innerText = messages[i];
appendLog(item);
}
};
} else {
var item = document.createElement("div");
item.innerHTML = "Your browser does not support WebSockets.";
appendLog(item);
}
};
```
--------------------------------
### Go: Upgrade HTTP to WebSocket Server
Source: https://context7.com/gorilla/websocket/llms.txt
Sets up a WebSocket server in Go that upgrades incoming HTTP connections. It utilizes the `websocket.Upgrader` for configuration, including buffer sizes and origin checking. The server accepts WebSocket messages, logs them, and echoes them back to the client.
```go
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
// Allow connections from any origin (adjust for production)
return true
},
}
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf("upgrade failed: %v", err)
return
}
defer conn.Close()
log.Printf("client connected from %v", conn.RemoteAddr())
// Handle messages
for {
messageType, message, err := conn.ReadMessage()
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
log.Printf("error: %v", err)
}
break
}
log.Printf("received: %s", message)
// Echo message back
if err := conn.WriteMessage(messageType, message); err != nil {
log.Printf("write error: %v", err)
break
}
}
}
func main() {
http.HandleFunc("/ws", handleWebSocket)
log.Fatal(http.ListenAndServe(":8080", nil))
}
```
--------------------------------
### Custom WebSocket Client Dialer in Go
Source: https://context7.com/gorilla/websocket/llms.txt
This Go code demonstrates creating a WebSocket client with a custom dialer from the gorilla/websocket library. It allows for advanced configuration options such as handshake timeouts, buffer sizes, compression, subprotocols, TLS settings (including skipping verification and minimum TLS version), and proxy support from environment variables. It also shows how to add custom headers for authentication and other metadata.
```go
package main
import (
"crypto/tls"
"log"
"net/http"
"net/url"
"time"
"github.com/gorilla/websocket"
)
func main() {
// Custom dialer with advanced configuration
dialer := &websocket.Dialer{
HandshakeTimeout: 10 * time.Second,
ReadBufferSize: 8192,
WriteBufferSize: 8192,
EnableCompression: true,
Subprotocols: []string{"chat", "superchat"},
TLSClientConfig: &tls.Config{
InsecureSkipVerify: false,
MinVersion: tls.VersionTLS12,
},
Proxy: http.ProxyFromEnvironment,
}
// Custom headers for authentication
headers := http.Header{}
headers.Add("Authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9")
headers.Add("X-Client-Version", "1.0.0")
headers.Add("User-Agent", "CustomWebSocketClient/1.0")
u := url.URL{Scheme: "wss", Host: "example.com", Path: "/ws"}
log.Printf("connecting to %s", u.String())
conn, resp, err := dialer.Dial(u.String(), headers)
if err != nil {
log.Fatalf("dial error: %v, status: %v", err, resp)
}
defer conn.Close()
log.Printf("connected, subprotocol: %s", conn.Subprotocol())
log.Printf("local addr: %v, remote addr: %v",
conn.LocalAddr(), conn.RemoteAddr())
// Set connection limits
conn.SetReadLimit(1024 * 1024) // 1MB
conn.SetReadDeadline(time.Now().Add(30 * time.Second))
// Send initial message
if err := conn.WriteMessage(websocket.TextMessage,
[]byte("Hello from custom client")); err != nil {
log.Fatalf("write error: %v", err)
}
// Read response
messageType, message, err := conn.ReadMessage()
if err != nil {
log.Fatalf("read error: %v", err)
}
log.Printf("received: type=%d, message=%s", messageType, message)
// Graceful close
closeMsg := websocket.FormatCloseMessage(websocket.CloseNormalClosure,
"client shutting down")
conn.WriteMessage(websocket.CloseMessage, closeMsg)
time.Sleep(time.Second) // Wait for close handshake
}
```
--------------------------------
### Go: Connect to WebSocket Server as Client
Source: https://context7.com/gorilla/websocket/llms.txt
Implements a WebSocket client in Go to connect to a specified server address. It includes graceful shutdown handling using OS signals and periodic message sending. The client reads messages from the server in a separate goroutine and manages connection lifecycle with timeouts.
```go
package main
import (
"log"
"net/url"
"os"
"os/signal"
"time"
"github.com/gorilla/websocket"
)
func main() {
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)
u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
log.Printf("connecting to %s", u.String())
conn, resp, err := websocket.DefaultDialer.Dial(u.String(), nil)
if err != nil {
log.Fatalf("dial failed: %v, response: %v", err, resp)
}
defer conn.Close()
done := make(chan struct{})
// Read messages in separate goroutine
go func() {
defer close(done)
for {
_, message, err := conn.ReadMessage()
if err != nil {
log.Printf("read error: %v", err)
return
}
log.Printf("received: %s", message)
}
}()
// Send messages periodically
ticker := time.NewTicker(2 * time.Second)
defer ticker.Stop()
for {
select {
case <-done:
return
case <-ticker.C:
message := []byte("Hello from client")
if err := conn.WriteMessage(websocket.TextMessage, message); err != nil {
log.Printf("write error: %v", err)
return
}
case <-interrupt:
log.Println("shutting down gracefully")
err := conn.WriteMessage(websocket.CloseMessage,
websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
if err != nil {
log.Printf("close error: %v", err)
}
select {
case <-done:
case <-time.After(time.Second):
}
return
}
}
}
```
--------------------------------
### Enable Per-Message Deflate Compression in Go WebSocket Server
Source: https://context7.com/gorilla/websocket/llms.txt
This Go code enables and configures per-message deflate compression for a WebSocket server. It uses the gorilla/websocket library and the standard flate compression package. The server can set compression levels and enable compression for outgoing messages, reducing bandwidth usage. It handles upgrading HTTP requests, reading messages, and writing compressed responses.
```go
package main
import (
"compress/flate"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 4096,
WriteBufferSize: 4096,
EnableCompression: true, // Enable compression negotiation
}
func handleCompression(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf("upgrade error: %v", err)
return
}
defer conn.Close()
// Set compression level (flate.BestSpeed to flate.BestCompression)
if err := conn.SetCompressionLevel(flate.BestSpeed); err != nil {
log.Printf("compression level error: %v", err)
return
}
// Enable compression for outgoing messages
conn.EnableWriteCompression(true)
log.Println("compression enabled, waiting for messages")
for {
messageType, message, err := conn.ReadMessage()
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
log.Printf("error: %v", err)
}
break
}
log.Printf("received compressed message: %d bytes", len(message))
// Large payload that benefits from compression
response := make([]byte, len(message)*2)
copy(response, message)
copy(response[len(message):], message)
// Write with compression
if err := conn.WriteMessage(messageType, response); err != nil {
log.Printf("write error: %v", err)
break
}
log.Printf("sent compressed response: %d bytes", len(response))
}
}
func main() {
http.HandleFunc("/compress", handleCompression)
log.Fatal(http.ListenAndServe(":8080", nil))
}
```
--------------------------------
### Stream Messages with NextWriter/NextReader in Go
Source: https://context7.com/gorilla/websocket/llms.txt
This Go code illustrates efficient handling of large WebSocket messages using the NextWriter and NextReader interfaces from the Gorilla WebSocket library. It avoids loading entire messages into memory by streaming data directly from the reader to the writer, suitable for real-time data pipelines. It requires the 'net/http', 'io', and 'github.com/gorilla/websocket' packages.
```go
package main
import (
"io"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{}
func handleStreaming(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf("upgrade error: %v", err)
return
}
defer conn.Close()
for {
// Get reader for incoming message
messageType, reader, err := conn.NextReader()
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
log.Printf("read error: %v", err)
}
break
}
log.Printf("receiving message type: %d", messageType)
// Get writer for outgoing message
writer, err := conn.NextWriter(messageType)
if err != nil {
log.Printf("writer error: %v", err)
break
}
// Stream data directly from reader to writer
bytesCopied, err := io.Copy(writer, reader)
if err != nil {
log.Printf("copy error: %v", err)
writer.Close()
break
}
log.Printf("echoed %d bytes", bytesCopied)
// Close writer to flush the message
if err := writer.Close(); err != nil {
log.Printf("close writer error: %v", err)
break
}
}
}
func main() {
http.HandleFunc("/stream", handleStreaming)
log.Fatal(http.ListenAndServe(":8080", nil))
}
```
--------------------------------
### Configure Read Limits and Timeouts with Gorilla WebSocket in Go
Source: https://context7.com/gorilla/websocket/llms.txt
This Go code snippet demonstrates how to configure connection limits and deadlines for WebSocket connections using the Gorilla WebSocket library. It sets read buffer sizes, handshake timeouts, read deadlines, and pong handlers to manage slow clients and prevent resource exhaustion. Dependencies include 'log', 'net/http', 'time', and 'github.com/gorilla/websocket'. It handles incoming messages and sends periodic ping messages to maintain the connection.
```go
package main
import (
"log"
"net/http"
"time"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
HandshakeTimeout: 10 * time.Second,
ReadBufferSize: 4096,
WriteBufferSize: 4096,
}
func handleWithLimits(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf("upgrade error: %v", err)
return
}
defer conn.Close()
// Set maximum message size to 512KB
conn.SetReadLimit(512 * 1024)
// Set read deadline - connection must receive pong within this time
conn.SetReadDeadline(time.Now().Add(60 * time.Second))
// Configure ping handler to update read deadline
conn.SetPongHandler(func(string) error {
conn.SetReadDeadline(time.Now().Add(60 * time.Second))
return nil
})
// Set write deadline for each write operation
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
// Start ping ticker to keep connection alive
ticker := time.NewTicker(30 * time.Second)
defer ticker.Stop()
done := make(chan struct{})
go func() {
defer close(done)
for {
_, message, err := conn.ReadMessage()
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
log.Printf("read error: %v", err)
}
return
}
log.Printf("received: %s", message)
}
}()
for {
select {
case <-ticker.C:
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
log.Printf("ping error: %v", err)
return
}
case <-done:
return
}
}
}
func main() {
http.HandleFunc("/limits", handleWithLimits)
log.Fatal(http.ListenAndServe(":8080", nil))
}
```
--------------------------------
### Implement Custom Ping/Pong Handlers in Go
Source: https://context7.com/gorilla/websocket/llms.txt
This Go code demonstrates how to implement custom handlers for ping, pong, and close control messages in WebSocket connections. It allows for application-specific logic when these messages are received or sent, including heartbeats and connection closure procedures. Dependencies include the 'net/http' and 'github.com/gorilla/websocket' packages.
```go
package main
import (
"log"
"net/http"
"time"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{}
func handleWithCustomHandlers(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf("upgrade error: %v", err)
return
}
defer conn.Close()
lastPong := time.Now()
// Custom pong handler
conn.SetPongHandler(func(appData string) error {
lastPong = time.Now()
log.Printf("received pong with data: %s", appData)
return nil
})
// Custom ping handler
conn.SetPingHandler(func(appData string) error {
log.Printf("received ping with data: %s", appData)
// Send pong with same application data
err := conn.WriteControl(websocket.PongMessage, []byte(appData),
time.Now().Add(time.Second))
if err != nil {
log.Printf("pong write error: %v", err)
}
return nil
})
// Custom close handler
conn.SetCloseHandler(func(code int, text string) error {
log.Printf("received close: code=%d, text=%s", code, text)
message := websocket.FormatCloseMessage(code, "")
conn.WriteControl(websocket.CloseMessage, message,
time.Now().Add(time.Second))
return nil
})
ticker := time.NewTicker(15 * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
// Check if last pong is too old
if time.Since(lastPong) > 45*time.Second {
log.Println("client unresponsive, closing connection")
return
}
// Send ping with timestamp
pingData := []byte(time.Now().Format(time.RFC3339))
if err := conn.WriteControl(websocket.PingMessage, pingData,
time.Now().Add(time.Second)); err != nil {
log.Printf("ping error: %v", err)
return
}
default:
_, _, err := conn.ReadMessage()
if err != nil {
return
}
}
}
}
func main() {
http.HandleFunc("/custom", handleWithCustomHandlers)
log.Fatal(http.ListenAndServe(":8080", nil))
}
```
--------------------------------
### Handle JSON Messages with Gorilla WebSocket in Go
Source: https://context7.com/gorilla/websocket/llms.txt
This Go code snippet demonstrates how to send and receive JSON-encoded messages using the Gorilla WebSocket library. It includes automatic marshaling and unmarshaling of custom message structs and handles connection upgrades. Dependencies include the standard library's 'log', 'net/http', 'time', and the 'github.com/gorilla/websocket' package. It expects incoming JSON messages conforming to the 'Message' struct and sends back a JSON response.
```go
package main
import (
"log"
"net/http"
"time"
"github.com/gorilla/websocket"
)
type Message struct {
Type string `json:"type"`
Content string `json:"content"`
Timestamp time.Time `json:"timestamp"`
UserID string `json:"user_id"`
}
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true },
}
func handleJSON(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf("upgrade error: %v", err)
return
}
defer conn.Close()
for {
var msg Message
// Read JSON message
if err := conn.ReadJSON(&msg); err != nil {
if websocket.IsCloseError(err, websocket.CloseNormalClosure) {
log.Println("connection closed normally")
} else {
log.Printf("read json error: %v", err)
}
break
}
log.Printf("received: type=%s, content=%s, user=%s",
msg.Type, msg.Content, msg.UserID)
// Send JSON response
response := Message{
Type: "response",
Content: "Message received: " + msg.Content,
Timestamp: time.Now(),
UserID: "server",
}
if err := conn.WriteJSON(response); err != nil {
log.Printf("write json error: %v", err)
break
}
}
}
func main() {
http.HandleFunc("/json", handleJSON)
log.Fatal(http.ListenAndServe(":8080", nil))
}
```
=== COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.