Fetch the repository succeeded.
Vex is a framework which uses tcp to exchange data.
Check HISTORY.md and FUTURE.md to know about more information.
The provided pack protocol defines a conception named packet no matter in request or response.
ABNF:
PACKET = MAGIC TYPE DATASIZE DATA
MAGIC = 3OCTET ; 3Bytes, current is 0xC638B which is 811915
TYPE = OCTET ; 0x00-0xFF, begin from one, 255 at most
DATASIZE = 4OCTET ; 4bytes, 4GB at most
DATA = *OCTET ; Size is determined by DATASIZE
In human:
Packet:
magic type data_size {data}
3byte 1byte 4byte unknown
$ go get -u github.com/FishGoddess/vex
We provide native and pack two ways to use: native is for customizing protocol and pack is a simple data transmission protocol.
Native client:
package main
import (
"fmt"
"github.com/FishGoddess/vex"
)
func main() {
client, err := vex.NewClient("127.0.0.1:6789")
if err != nil {
panic(err)
}
defer client.Close()
msg := []byte("hello")
if _, err := client.Write(msg); err != nil {
panic(err)
}
var buf [1024]byte
n, err := client.Read(buf[:])
if err != nil {
panic(err)
}
fmt.Println("Received:", string(buf[:n]))
}
Native server:
package main
import (
"fmt"
"io"
"github.com/FishGoddess/vex"
)
func handle(ctx *vex.Context) {
var buf [1024]byte
for {
n, err := ctx.Read(buf[:])
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
fmt.Println("Received:", string(buf[:n]))
if _, err = ctx.Write(buf[:n]); err != nil {
panic(err)
}
}
}
func main() {
// Create a server listening on 127.0.0.1:6789 and set a handle function to it.
// Also, we can give it a name like "echo" so we can see it in logs.
server := vex.NewServer("127.0.0.1:6789", handle, vex.WithName("echo"))
// Use Serve() to begin serving.
// Press ctrl+c/control+c to close the server.
if err := server.Serve(); err != nil {
panic(err)
}
}
Pack client:
package main
import (
"fmt"
"github.com/FishGoddess/vex"
"github.com/FishGoddess/vex/pack"
)
func main() {
client, err := vex.NewClient("127.0.0.1:6789")
if err != nil {
panic(err)
}
defer client.Close()
// Use Send method to send a packet to server and receive a packet from server.
// Try to change 'hello' to 'error' and see what happens.
packet, err := pack.Send(client, 1, []byte("hello"))
if err != nil {
panic(err)
}
fmt.Println(string(packet))
}
Pack server:
package main
import (
"context"
"errors"
"fmt"
"github.com/FishGoddess/vex"
"github.com/FishGoddess/vex/pack"
)
func newRouter() *pack.Router {
router := pack.NewRouter()
// Use Register method to register your handler for some packets.
router.Register(1, func(ctx context.Context, packetType pack.PacketType, requestPacket []byte) (responsePacket []byte, err error) {
msg := string(requestPacket)
fmt.Println(msg)
if msg == "error" {
return nil, errors.New(msg)
} else {
return requestPacket, nil
}
})
return router
}
func main() {
// Create a router for packets.
router := newRouter()
// Create a server listening on 127.0.0.1:6789 and set a handle function to it.
server := vex.NewServer("127.0.0.1:6789", router.Handle, vex.WithName("pack"))
// Use Serve() to begin serving.
// Press ctrl+c/control+c to close the server.
if err := server.Serve(); err != nil {
panic(err)
}
}
All examples can be found in _examples.
$ make bench
BenchmarkReadWrite-16 172698 6795 ns/op 0 B/op 0 allocs/op
BenchmarkPackReadWrite-16 76129 16057 ns/op 2080 B/op 6 allocs/op
Protocol | Connections | rps |
---|---|---|
- | 1 | 77128 |
- | 16 | 256088 |
Pack | 1 | 49796 |
Pack | 16 | 200490 |
Packet size is 1KB.
Environment: R7-5800X@3.8GHZ CPU, 32GB RAM, deepin linux.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。