40 lines
1012 B
Go
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
|
|
}
|