mirror of
https://github.com/kataras/iris.git
synced 2025-01-23 18:51:03 +01:00
ddec78af0a
Former-commit-id: 444d4f0718d5c6d7544834c5e44dafb872980238
135 lines
5.0 KiB
Markdown
135 lines
5.0 KiB
Markdown
# Websocket
|
|
|
|
[WebSocket](https://wikipedia.org/wiki/WebSocket) is a protocol that enables two-way persistent communication channels over TCP connections. It is used for applications such as chat, stock tickers, games, anywhere you want real-time functionality in a web application.
|
|
|
|
[View or download sample code](https://github.com/kataras/iris/tree/master/_examples/websocket).
|
|
|
|
## When to use it
|
|
|
|
Use WebSockets when you need to work directly with a socket connection. For example, you might need the best possible performance for a real-time game.
|
|
|
|
## How to use it
|
|
|
|
* import the `"github.com/kataras/iris/websocket"`
|
|
* Configure the websocket package.
|
|
* Accept WebSocket requests.
|
|
* Send and receive messages.
|
|
|
|
### Import the websocket package
|
|
|
|
```go
|
|
import "github.com/kataras/iris/websocket"
|
|
```
|
|
|
|
### Configure the websocket package
|
|
|
|
```go
|
|
import "github.com/kataras/iris/websocket"
|
|
|
|
func main() {
|
|
ws := websocket.New(websocket.Config{
|
|
ReadBufferSize: 1024,
|
|
WriteBufferSize: 1024,
|
|
})
|
|
}
|
|
```
|
|
|
|
#### Complete configuration
|
|
|
|
```go
|
|
// Config the websocket server configuration
|
|
// all of these are optional.
|
|
type Config struct {
|
|
// IDGenerator used to create (and later on, set)
|
|
// an ID for each incoming websocket connections (clients).
|
|
// The request is an argument which you can use to generate the ID (from headers for example).
|
|
// If empty then the ID is generated by DefaultIDGenerator: randomString(64)
|
|
IDGenerator func(ctx context.Context) string
|
|
// Error is the function that will be fired if any client couldn't upgrade the HTTP connection
|
|
// to a websocket connection, a handshake error.
|
|
Error func(w http.ResponseWriter, r *http.Request, status int, reason error)
|
|
// CheckOrigin a function that is called right before the handshake,
|
|
// if returns false then that client is not allowed to connect with the websocket server.
|
|
CheckOrigin func(r *http.Request) bool
|
|
// HandshakeTimeout specifies the duration for the handshake to complete.
|
|
HandshakeTimeout time.Duration
|
|
// WriteTimeout time allowed to write a message to the connection.
|
|
// 0 means no timeout.
|
|
// Default value is 0
|
|
WriteTimeout time.Duration
|
|
// ReadTimeout time allowed to read a message from the connection.
|
|
// 0 means no timeout.
|
|
// Default value is 0
|
|
ReadTimeout time.Duration
|
|
// PongTimeout allowed to read the next pong message from the connection.
|
|
// Default value is 60 * time.Second
|
|
PongTimeout time.Duration
|
|
// PingPeriod send ping messages to the connection with this period. Must be less than PongTimeout.
|
|
// Default value is 60 *time.Second
|
|
PingPeriod time.Duration
|
|
// MaxMessageSize max message size allowed from connection.
|
|
// Default value is 1024
|
|
MaxMessageSize int64
|
|
// BinaryMessages set it to true in order to denotes binary data messages instead of utf-8 text
|
|
// compatible if you wanna use the Connection's EmitMessage to send a custom binary data to the client, like a native server-client communication.
|
|
// defaults to false
|
|
BinaryMessages bool
|
|
// ReadBufferSize is the buffer size for the underline reader
|
|
// Default value is 4096
|
|
ReadBufferSize int
|
|
// WriteBufferSize is the buffer size for the underline writer
|
|
// Default value is 4096
|
|
WriteBufferSize int
|
|
// EnableCompression specify if the server should attempt to negotiate per
|
|
// message compression (RFC 7692). Setting this value to true does not
|
|
// guarantee that compression will be supported. Currently only "no context
|
|
// takeover" modes are supported.
|
|
EnableCompression bool
|
|
|
|
// Subprotocols specifies the server's supported protocols in order of
|
|
// preference. If this field is set, then the Upgrade method negotiates a
|
|
// subprotocol by selecting the first match in this list with a protocol
|
|
// requested by the client.
|
|
Subprotocols []string
|
|
}
|
|
```
|
|
|
|
### Accept WebSocket requests & send & receive messages
|
|
|
|
```go
|
|
import (
|
|
"github.com/kataras/iris"
|
|
"github.com/kataras/iris/websocket"
|
|
)
|
|
|
|
func main() {
|
|
ws := websocket.New(websocket.Config{
|
|
ReadBufferSize: 1024,
|
|
WriteBufferSize: 1024,
|
|
})
|
|
|
|
ws.OnConnection(handleConnection)
|
|
|
|
app := iris.New()
|
|
// register the server on an endpoint.
|
|
// see the inline javascript code in the websockets.html, this endpoint is used to connect to the server.
|
|
app.Get("/echo", ws.Handler())
|
|
|
|
// serve the javascript builtin client-side library,
|
|
// see websockets.html script tags, this path is used.
|
|
app.Any("/iris-ws.js", func(ctx iris.Context) {
|
|
ctx.Write(websocket.ClientSource)
|
|
})
|
|
}
|
|
|
|
func handleConnection(c websocket.Connection) {
|
|
// Read events from browser
|
|
c.On("chat", func(msg string) {
|
|
// Print the message to the console, c.Context() is the iris's http context.
|
|
fmt.Printf("%s sent: %s\n", c.Context().RemoteAddr(), msg)
|
|
// Write message back to the client message owner:
|
|
// c.Emit("chat", msg)
|
|
c.To(websocket.Broadcast).Emit("chat", msg)
|
|
})
|
|
}
|
|
``` |