goaidb/network/server.go

70 lines
1.4 KiB
Go

// Package network 实现网络通信层
package network
import (
"fmt"
"io"
"net"
"github.com/kingecg/goaidb/protocol"
"github.com/kingecg/goaidb/query"
"github.com/kingecg/goaidb/storage"
)
// Server 网络服务器结构体
type Server struct {
storage storage.StorageEngine
}
// NewServer 创建新的网络服务器
func NewServer(storage storage.StorageEngine) *Server {
return &Server{storage: storage}
}
// Serve 启动服务
func (s *Server) Serve(listener net.Listener) {
for {
conn, err := listener.Accept()
if err != nil {
fmt.Printf("Failed to accept connection: %v\n", err)
continue
}
go s.handleConnection(conn)
}
}
// 处理客户端连接
func (s *Server) handleConnection(conn net.Conn) {
defer conn.Close()
buffer := make([]byte, 4*1024) // 4KB缓冲区
for {
n, err := conn.Read(buffer)
if err != nil {
if err != io.EOF {
fmt.Printf("Error reading from connection: %v\n", err)
}
return
}
// 解析MongoDB协议消息
message, err := protocol.ParseMessage(buffer[:n])
if err != nil {
fmt.Printf("Failed to parse message: %v\n", err)
continue
}
// 处理查询请求
response, err := query.HandleQuery(message, s.storage)
if err != nil {
fmt.Printf("Query handling error: %v\n", err)
continue
}
// 发送响应
_, err = conn.Write(response)
if err != nil {
fmt.Printf("Failed to send response: %v\n", err)
return
}
}
}