first commit
This commit is contained in:
39
framing.go
Normal file
39
framing.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package gobridge
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
)
|
||||
|
||||
// writeMsg 将消息以 [4字节长度][JSON载荷] 格式写入连接
|
||||
func writeMsg(conn net.Conn, msg Message) error {
|
||||
data, err := json.Marshal(msg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("marshal message: %w", err)
|
||||
}
|
||||
header := make([]byte, 4)
|
||||
binary.BigEndian.PutUint32(header, uint32(len(data)))
|
||||
_, err = conn.Write(append(header, data...))
|
||||
return err
|
||||
}
|
||||
|
||||
// readMsg 从连接中读取一条消息
|
||||
func readMsg(conn net.Conn) (Message, error) {
|
||||
header := make([]byte, 4)
|
||||
if _, err := io.ReadFull(conn, header); err != nil {
|
||||
return Message{}, fmt.Errorf("read header: %w", err)
|
||||
}
|
||||
length := binary.BigEndian.Uint32(header)
|
||||
body := make([]byte, length)
|
||||
if _, err := io.ReadFull(conn, body); err != nil {
|
||||
return Message{}, fmt.Errorf("read body: %w", err)
|
||||
}
|
||||
var msg Message
|
||||
if err := json.Unmarshal(body, &msg); err != nil {
|
||||
return Message{}, fmt.Errorf("unmarshal message: %w", err)
|
||||
}
|
||||
return msg, nil
|
||||
}
|
||||
Reference in New Issue
Block a user