Awesome
websocket
Package websocket implements a client and server for the WebSocket protocol as specified in RFC 6455.
Feature
- Upgrade HTTP/Conn
- Epoll/Kqueue
- TLS
Benchmark
<img src="https://raw.githubusercontent.com/hslam/websocket-benchmark/master/websocket-qps.png" width = "400" height = "300" alt="websocket-qps" align=center><img src="https://raw.githubusercontent.com/hslam/websocket-benchmark/master/websocket-p99.png" width = "400" height = "300" alt="websocket-p99" align=center>
Get started
Install
go get github.com/hslam/websocket
Import
import "github.com/hslam/websocket"
Usage
Example
server.go
package main
import (
"github.com/hslam/mux"
"github.com/hslam/websocket"
"log"
"net/http"
"strings"
)
func main() {
m := mux.New()
m.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
conn, err := websocket.UpgradeHTTP(w, r)
if err != nil {
return
}
for {
var message string
err := conn.ReceiveMessage(&message)
if err != nil {
break
}
conn.SendMessage(strings.ToUpper(string(message)))
}
conn.Close()
}).GET()
log.Fatal(http.ListenAndServe(":8080", m))
}
server_poll.go
package main
import (
"github.com/hslam/netpoll"
"github.com/hslam/websocket"
"net"
"strings"
)
func main() {
var handler = &netpoll.ConnHandler{}
handler.SetUpgrade(func(conn net.Conn) (netpoll.Context, error) {
return websocket.Upgrade(conn, nil)
})
handler.SetServe(func(context netpoll.Context) error {
ws := context.(*websocket.Conn)
var message string
err := ws.ReceiveMessage(&message)
if err != nil {
return err
}
return ws.SendMessage(strings.ToUpper(string(message)))
})
if err := netpoll.ListenAndServe("tcp", ":8080", handler); err != nil {
panic(err)
}
}
client.go
package main
import (
"fmt"
"github.com/hslam/websocket"
"time"
)
func main() {
conn, err := websocket.Dial("tcp", "127.0.0.1:8080", "/", nil)
if err != nil {
panic(err)
}
defer conn.Close()
for i := 0; i < 1; i++ {
conn.SendMessage("Hello World")
var message string
err := conn.ReceiveMessage(&message)
if err != nil {
break
}
fmt.Println(message)
time.Sleep(time.Second)
}
}
Output
HELLO WORLD
client.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Websocket</title>
</head>
<body>
<h1>UPPER</h1>
<form><p>string: <input id="content" type="text" placeholder="input string"></p></form>
<label id="result">result:</label><br><br>
<button onclick="send()">upper</button>
<script type="text/javascript">
var wsuri = "ws://127.0.0.1:8080/";
var ws = new WebSocket(wsuri);
ws.onmessage = function(e) {
var result = document.getElementById('result');
result.innerHTML = "result:" + e.data;
}
function send() {
var msg = document.getElementById('content').value;
ws.send(msg);
}
</script>
</body>
</html>
License
This package is licensed under a MIT license (Copyright (c) 2020 Meng Huang)
Author
websocket was written by Meng Huang.