Documentation
¶
Overview ¶
Package binproto implements low-level support for binary-based two-way communication protocols.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrMessageSizeExceeded = errors.New("binproto: message too big") ErrMessageMalformed = errors.New("binproto: message malformed") )
Functions ¶
This section is empty.
Types ¶
type Conn ¶
A Conn represents a binary network protocol connection. It consists of a Reader and Writer to manage I/O and a Pipeline (which is borrowed from textproto) to sequence concurrent requests on the connection.
func Dial ¶
Dial connects to the given address on the given network using net.Dial and then returns a new Conn for the connection.
Example ¶
package main
import (
"fmt"
"log"
"net"
"time"
"github.com/tetsuo/binproto"
)
func main() {
s := &server{}
time.AfterFunc(time.Millisecond*1, func() {
c, err := binproto.Dial("tcp", ":4242")
if err != nil {
log.Fatal(err)
}
go func() {
msg := &binproto.Message{}
for {
err := c.ReadMessage(msg)
if err != nil {
log.Fatal(err)
return
}
fmt.Printf("%d %d %s\n", msg.ID, msg.Type, msg.Data)
s.close()
}
}()
_, err = c.Send(binproto.NewMessage(42, 3, []byte("hi")))
if err != nil {
log.Fatal(err)
}
})
if err := s.serve("tcp", ":4242"); err != nil {
log.Fatal(err)
}
}
type server struct {
listener net.Listener
}
func (s *server) handle(conn net.Conn) {
defer conn.Close()
c := binproto.NewConn(conn)
msg := &binproto.Message{}
for {
err := c.ReadMessage(msg)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Printf("%d %d %s\n", msg.ID, msg.Type, msg.Data)
_, err = c.Send(binproto.NewMessage(112, 5, []byte("hey")))
if err != nil {
log.Fatal(err)
}
}
}
func (s *server) serve(network, address string) error {
l, err := net.Listen(network, address)
if err != nil {
return err
}
s.listener = l
for {
if s.listener == nil {
break
}
c, err := l.Accept()
if err != nil {
continue
}
go s.handle(c)
}
return nil
}
func (s *server) close() error {
err := s.listener.Close()
s.listener = nil
return err
}
Output: 42 3 hi 112 5 hey
func NewConn ¶
func NewConn(conn io.ReadWriteCloser) *Conn
NewConn returns a new Conn using conn for I/O.
type Message ¶
A Message represents a single binproto message.
Each message starts with an header which is a varint encoded unsigned 64-bit integer which consists of a channel ID (first 60-bits) and a message type (last 4-bits), the rest of the message is payload.
type Reader ¶
type Reader struct {
// contains filtered or unexported fields
}
A Reader implements convenience methods for reading requests or responses from a binary protocol network connection.
func NewReader ¶
NewReader returns a new Reader reading from r.
By default, a Reader allocates 4096 bytes for its internal buffer.
func NewReaderSize ¶
NewReaderSize returns a new Reader with the specified buffer size.
func (*Reader) ReadMessage ¶
ReadMessage reads a single message from r.
type Writer ¶
type Writer struct {
// contains filtered or unexported fields
}
A Writer implements convenience methods for writing requests or responses to a binary protocol network connection.
func (*Writer) WriteMessage ¶
WriteMessage writes a variable number of messages to w.