Files
gobridge/framing.go
2026-04-10 09:24:28 +08:00

40 lines
1012 B
Go

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
}