李恒道 发表于 2023-5-6 23:50:11

go ServeConn/ServeCodec/ServeRequest区别

# ServeConn
默认指定了gob的解码编码器,然后调用ServeCodec
# ServeCodec
持续监听传入的对象,一直到停止接受后,主动关闭通信对象
通常用于tcp通信
```go
// ServeCodec is like ServeConn but uses the specified codec to
// decode requests and encode responses.
func (server *Server) ServeCodec(codec ServerCodec) {
        sending := new(sync.Mutex)
        wg := new(sync.WaitGroup)
        for {
                service, mtype, req, argv, replyv, keepReading, err := server.readRequest(codec)
                if err != nil {
                        if debugLog && err != io.EOF {
                                log.Println("rpc:", err)
                        }
                        if !keepReading {
                                break
                        }
                        // send a response if we actually managed to read a header.
                        if req != nil {
                                server.sendResponse(sending, req, invalidRequest, codec, err.Error())
                                server.freeRequest(req)
                        }
                        continue
                }
                wg.Add(1)
                go service.call(server, sending, wg, mtype, req, argv, replyv, codec)
        }
        // We've seen that there are no more requests.
        // Wait for responses to be sent before closing codec.
        wg.Wait()
        codec.Close()
}
```
# ServeRequest
仅进行一次通信,并且不进行关闭
通常用于http协议
```go
func (server *Server) ServeRequest(codec ServerCodec) error {
        sending := new(sync.Mutex)
        service, mtype, req, argv, replyv, keepReading, err := server.readRequest(codec)
        if err != nil {
                if !keepReading {
                        return err
                }
                // send a response if we actually managed to read a header.
                if req != nil {
                        server.sendResponse(sending, req, invalidRequest, codec, err.Error())
                        server.freeRequest(req)
                }
                return err
        }
        service.call(server, sending, nil, mtype, req, argv, replyv, codec)
        return nil
}
```
页: [1]
查看完整版本: go ServeConn/ServeCodec/ServeRequest区别