70 lines
1.4 KiB
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
|
||
|
}
|
||
|
}
|
||
|
}
|