Documentation
¶
Index ¶
- Constants
- Variables
- type Frame
- type Message
- type OpCode
- type WebSocket
- func Connect(ctx context.Context, request *http.Request) (WebSocket, error)
- func ConnectWithDialer(ctx context.Context, ...) (WebSocket, error)
- func New(url string) (WebSocket, error)
- func NewWebSocket(writer io.WriteCloser, reader io.ReadCloser, mask bool) WebSocket
- func Pair(w http.ResponseWriter, req *http.Request) (WebSocket, error)
- func ServerPair(writer io.WriteCloser, reader io.ReadCloser) (WebSocket, error)
Constants ¶
const ( OPEN uint8 = iota + 1 CLOSING CLOSED )
Variables ¶
var (
ErrClosedStatus = errors.New("WebSocket is already in CLOSING or CLOSED state")
)
var ErrHijackResponseWriterFailed = errors.New("hijack the http.ResponseWriter failed")
var ErrPreviousMessageNotReadToCompletion = errors.New("previous message not read to completion")
var OpCodeName = []string{ ContinuationFrame: "ContinuationFrame", TextFrame: "TextFrame", BinaryFrame: "BinaryFrame", ReservedNonControlFrame1: "ReservedNonControlFrame1", ReservedNonControlFrame2: "ReservedNonControlFrame2", ReservedNonControlFrame3: "ReservedNonControlFrame3", ReservedNonControlFrame4: "ReservedNonControlFrame4", ReservedNonControlFrame5: "ReservedNonControlFrame5", ConnectionClose: "ConnectionClose", Ping: "Ping", Pong: "Pong", ReservedControlFrame1: "ReservedControlFrame1", ReservedControlFrame2: "ReservedControlFrame2", ReservedControlFrame3: "ReservedControlFrame3", ReservedControlFrame4: "ReservedControlFrame4", ReservedControlFrame5: "ReservedControlFrame5", }
Functions ¶
This section is empty.
Types ¶
type Frame ¶
type Frame struct { Payload *io.LimitedReader Fin bool Mask bool OpCode OpCode }
type OpCode ¶
type OpCode byte
const ( ContinuationFrame OpCode = iota TextFrame BinaryFrame ReservedNonControlFrame1 ReservedNonControlFrame2 ReservedNonControlFrame3 ReservedNonControlFrame4 ReservedNonControlFrame5 ConnectionClose Ping Pong ReservedControlFrame1 ReservedControlFrame2 ReservedControlFrame3 ReservedControlFrame4 ReservedControlFrame5 )
type WebSocket ¶
type WebSocket interface { // Send 发送文本数据 Send(text string) error // Ping 是用来发送一个 ping 帧,判断连接情况。 // 如果有错误,代表连接有问题。 // 否则就代表连接一切正常。 Ping() error // Close 用于关闭 WebSocket 对象的流 Close() error // Status 用于获取 WebSocket 对象的状态 Status() uint8 // ReadMessage 用于接收 Message 数据 ReadMessage() (*Message, error) // SendMessage 用于发送 Message 数据 SendMessage(message *Message) error }
func Connect ¶
Connect 使用一个 HTTP 请求来创建 WebSocket 对象。 可以通过设置环境变量 ALL_PROXY 来使用代理服务器。 传入 HTTP 请求的方法,可以用于需要验证的 WebSocket 连接,自定义添加验证信息到请求头中。
func ConnectWithDialer ¶
func ConnectWithDialer(ctx context.Context, dialer func(context.Context, string, string) (net.Conn, error), request *http.Request) (WebSocket, error)
ConnectWithDialer 传入自定义 dialer,然后创建一个 WebSocket 。 这个函数主要考虑是用于自定义代理方法来连接目标 WebSocket。
func New ¶
New 使用 url 链接来创建一个 WebSocket 对象。 可以通过设置环境变量 ALL_PROXY 来使用代理服务器。
例子1:wss://ws.postman-echo.com/raw/ 例子2:http://example.com/ws
func NewWebSocket ¶
func NewWebSocket(writer io.WriteCloser, reader io.ReadCloser, mask bool) WebSocket
NewWebSocket 使用 io.WriteCloser 和 io.ReadCloser 创建一个 WebSocket 对象。 io.WriteCloser 是输出流,io.ReadCloser 是输入流,不一定要同一条双向流的 io.WriteCloser 和 io.ReadCloser。 这样的好处就是,可以使用 2 条单向的流,模拟成 1 条双向的流。 使用 NewWebSocket 这个函数,就可以单独的去使用 WebSocket 协议,无需经过 HTTP 的 Connection Upgrade 到 WebSocket ,也就是可以让一条纯 TCP 连接去使用。
func Pair ¶
Pair 用于 HTTP 服务端接收一个 WebSocket 对象
使用例子:
http.HandleFunc("/ws",func(w http.ResponseWriter,request *http.Request){ ws,err := websocket.Pair(w,request) if err != nil { return } fmt.Println(ws) }) http.ListenAndServe("0.0.0.0:8080")
func ServerPair ¶
func ServerPair(writer io.WriteCloser, reader io.ReadCloser) (WebSocket, error)
ServerPair 用于传入 io.WriteCloser 和 io.ReadCloser 来创建 WebSocket。 可以用于自己编写的 WEB 服务来创建一个 WebSocket 对象。