mirror of
https://github.com/geektutu/7days-golang.git
synced 2024-04-21 12:32:11 +00:00
58 lines
1003 B
Go
58 lines
1003 B
Go
package codec
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/gob"
|
|
"io"
|
|
"log"
|
|
)
|
|
|
|
type GobCodec struct {
|
|
conn io.ReadWriteCloser
|
|
buf *bufio.Writer
|
|
dec *gob.Decoder
|
|
enc *gob.Encoder
|
|
}
|
|
|
|
var _ Codec = (*GobCodec)(nil)
|
|
|
|
func NewGobCodec(conn io.ReadWriteCloser) Codec {
|
|
buf := bufio.NewWriter(conn)
|
|
return &GobCodec{
|
|
conn: conn,
|
|
buf: buf,
|
|
dec: gob.NewDecoder(conn),
|
|
enc: gob.NewEncoder(buf),
|
|
}
|
|
}
|
|
|
|
func (c *GobCodec) ReadHeader(h *Header) error {
|
|
return c.dec.Decode(h)
|
|
}
|
|
|
|
func (c *GobCodec) ReadBody(body interface{}) error {
|
|
return c.dec.Decode(body)
|
|
}
|
|
|
|
func (c *GobCodec) Write(h *Header, body interface{}) (err error) {
|
|
defer func() {
|
|
_ = c.buf.Flush()
|
|
if err != nil {
|
|
_ = c.Close()
|
|
}
|
|
}()
|
|
if err := c.enc.Encode(h); err != nil {
|
|
log.Println("rpc: gob error encoding header:", err)
|
|
return err
|
|
}
|
|
if err := c.enc.Encode(body); err != nil {
|
|
log.Println("rpc: gob error encoding body:", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *GobCodec) Close() error {
|
|
return c.conn.Close()
|
|
}
|