mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-08-21 08:27:11 +00:00
perf[golang]: go的zfoo服务器,使用atomic自增作为uuid
This commit is contained in:
@@ -17,15 +17,15 @@ import (
|
||||
"encoding/binary"
|
||||
)
|
||||
|
||||
// Encode from Message to []byte
|
||||
func Encode(msg *Message) ([]byte, error) {
|
||||
// Encode from Packet to []byte
|
||||
func Encode(msg *Packet) ([]byte, error) {
|
||||
buffer := new(bytes.Buffer)
|
||||
|
||||
err := binary.Write(buffer, binary.LittleEndian, msg.msgSize)
|
||||
err := binary.Write(buffer, binary.LittleEndian, msg.length)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = binary.Write(buffer, binary.LittleEndian, msg.msgID)
|
||||
err = binary.Write(buffer, binary.LittleEndian, msg.protocolId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -36,29 +36,29 @@ func Encode(msg *Message) ([]byte, error) {
|
||||
return buffer.Bytes(), nil
|
||||
}
|
||||
|
||||
// Decode from []byte to Message
|
||||
func Decode(data []byte) (*Message, error) {
|
||||
// Decode from []byte to Packet
|
||||
func Decode(data []byte) (*Packet, error) {
|
||||
bufReader := bytes.NewReader(data)
|
||||
|
||||
dataSize := len(data)
|
||||
// 读取消息ID
|
||||
var msgID int32
|
||||
err := binary.Read(bufReader, binary.LittleEndian, &msgID)
|
||||
var protocolId int16
|
||||
err := binary.Read(bufReader, binary.LittleEndian, &protocolId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 读取数据
|
||||
dataBufLength := dataSize - 4 - 4
|
||||
dataBufLength := dataSize - 2 - 4
|
||||
dataBuf := make([]byte, dataBufLength)
|
||||
err = binary.Read(bufReader, binary.LittleEndian, &dataBuf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
message := &Message{}
|
||||
message.msgSize = int32(dataSize)
|
||||
message.msgID = msgID
|
||||
message := &Packet{}
|
||||
message.length = int32(dataSize)
|
||||
message.protocolId = protocolId
|
||||
message.data = dataBuf
|
||||
|
||||
return message, nil
|
||||
|
||||
@@ -29,7 +29,7 @@ type Conn struct {
|
||||
done chan error
|
||||
hbTimer *time.Timer
|
||||
name string
|
||||
messageCh chan *Message
|
||||
messageCh chan *Packet
|
||||
hbInterval time.Duration
|
||||
hbTimeout time.Duration
|
||||
}
|
||||
@@ -45,7 +45,7 @@ func NewConn(c net.Conn, hbInterval time.Duration, hbTimeout time.Duration) *Con
|
||||
rawConn: c,
|
||||
sendCh: make(chan []byte, 100),
|
||||
done: make(chan error),
|
||||
messageCh: make(chan *Message, 100),
|
||||
messageCh: make(chan *Packet, 100),
|
||||
hbInterval: hbInterval,
|
||||
hbTimeout: hbTimeout,
|
||||
}
|
||||
@@ -67,7 +67,7 @@ func (c *Conn) Close() {
|
||||
}
|
||||
|
||||
// SendMessage send message
|
||||
func (c *Conn) SendMessage(msg *Message) error {
|
||||
func (c *Conn) SendMessage(msg *Packet) error {
|
||||
pkg, err := Encode(msg)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -156,7 +156,7 @@ func (c *Conn) readCoroutine(ctx context.Context) {
|
||||
continue
|
||||
}
|
||||
|
||||
if msg.msgID == MsgHeartbeat {
|
||||
if msg.protocolId == MsgHeartbeat {
|
||||
continue
|
||||
}
|
||||
|
||||
|
||||
@@ -15,24 +15,24 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Message struct
|
||||
type Message struct {
|
||||
msgSize int32
|
||||
msgID int32
|
||||
data []byte
|
||||
// Packet struct
|
||||
type Packet struct {
|
||||
length int32
|
||||
protocolId int16
|
||||
data []byte
|
||||
}
|
||||
|
||||
// NewMessage create a new message
|
||||
func NewMessage(msgID int32, data []byte) *Message {
|
||||
msg := &Message{
|
||||
msgSize: int32(len(data)) + 4 + 4,
|
||||
msgID: msgID,
|
||||
data: data,
|
||||
func NewMessage(protocolId int16, data []byte) *Packet {
|
||||
msg := &Packet{
|
||||
length: int32(len(data)) + 4 + 4,
|
||||
protocolId: protocolId,
|
||||
data: data,
|
||||
}
|
||||
return msg
|
||||
}
|
||||
|
||||
|
||||
func (msg *Message) String() string {
|
||||
return fmt.Sprintf("Size=%d ID=%d DataLen=%d", msg.msgSize, msg.msgID, len(msg.data))
|
||||
func (msg *Packet) String() string {
|
||||
return fmt.Sprintf("Size=%d ID=%d DataLen=%d", msg.length, msg.protocolId, len(msg.data))
|
||||
}
|
||||
@@ -21,7 +21,7 @@ import (
|
||||
|
||||
// SocketService struct
|
||||
type SocketService struct {
|
||||
onMessage func(*Session, *Message)
|
||||
onMessage func(*Session, *Packet)
|
||||
onConnect func(*Session)
|
||||
onDisconnect func(*Session, error)
|
||||
sessions *sync.Map
|
||||
@@ -56,7 +56,7 @@ func NewSocketService(laddr string) (*SocketService, error) {
|
||||
}
|
||||
|
||||
// RegMessageHandler register message handler
|
||||
func (s *SocketService) RegMessageHandler(handler func(*Session, *Message)) {
|
||||
func (s *SocketService) RegMessageHandler(handler func(*Session, *Packet)) {
|
||||
s.onMessage = handler
|
||||
}
|
||||
|
||||
@@ -175,7 +175,7 @@ func (s *SocketService) GetConnsCount() int {
|
||||
}
|
||||
|
||||
// Unicast Unicast with session ID
|
||||
func (s *SocketService) Unicast(sid string, msg *Message) {
|
||||
func (s *SocketService) Unicast(sid string, msg *Packet) {
|
||||
v, ok := s.sessions.Load(sid)
|
||||
if ok {
|
||||
session := v.(*Session)
|
||||
@@ -187,7 +187,7 @@ func (s *SocketService) Unicast(sid string, msg *Message) {
|
||||
}
|
||||
|
||||
// Broadcast Broadcast to all connections
|
||||
func (s *SocketService) Broadcast(msg *Message) {
|
||||
func (s *SocketService) Broadcast(msg *Packet) {
|
||||
s.sessions.Range(func(k, v interface{}) bool {
|
||||
s := v.(*Session)
|
||||
if err := s.conn.SendMessage(msg); err != nil {
|
||||
|
||||
@@ -45,8 +45,8 @@ func TestService(t *testing.T) {
|
||||
ss.Serv()
|
||||
}
|
||||
|
||||
func HandleMessage(s *Session, msg *Message) {
|
||||
fmt.Println("receive msgID:", msg)
|
||||
func HandleMessage(s *Session, msg *Packet) {
|
||||
fmt.Println("receive protocolId:", msg)
|
||||
fmt.Println("receive data:", string(msg.data))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user