[golang]关于link包的日记(2)

link的启动非常简单,server.go提供了一个Listen方法,可以快速的启动一个socket服务。

Listen函数的代码如下:

// The easy way to setup a server.
func Listen(network, address string) (*Server, error) {
    listener, err := net.Listen(network, address)
    if err != nil {
        return nil, err
    }
    return NewServer(listener, DefaultProtocol), nil
}

可以看到Listen函数实际上是调用net包监听端口并设置了默认的协议规则.Listen返回的是Server,Server的类型声明如下:

// Server.
type Server struct {
    // About network
    listener    net.Listener 
    protocol    Protocol //协议
    broadcaster *Broadcaster //广播

    // About sessions
    maxSessionId uint64 //会话ID是递增的,这里保存当前最大的ID
    sessions     map[uint64]*Session //所有的会话用map来管理
    sessionMutex sync.Mutex 

    // About server start and stop
    stopFlag int32
    stopWait sync.WaitGroup

    SendChanSize   int         // Session send chan buffer size.
    ReadBufferSize int         // Session read buffer size.
    State          interface{} // server state.
}

也可以直接NewServer,可以自定义解析协议,代码如下:

// Create a server.
func NewServer(listener net.Listener, protocol Protocol) *Server {
    server := &Server{
        listener:       listener,
        protocol:       protocol,
        sessions:       make(map[uint64]*Session),
        SendChanSize:   DefaultSendChanSize,
        ReadBufferSize: DefaultConnBufferSize,
    }
    protocolState, _ := protocol.New(server, SERVER_SIDE)
    server.broadcaster = NewBroadcaster(protocolState, server.fetchSession)
    return server
}

可以看到NewServer的时候做了些初始化工作,初始化会话列表,设置默认读写大小,初始化协议解析,初始化广播消息发送。
协议的解析见protocol.go,也可以自己定制协议来解析。

标签: golang, link

添加新评论