上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

go ServeConn/ServeCodec/ServeRequest区别

[复制链接]
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5966

    回帖

    6763

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6763

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-5-6 23:50:11 | 显示全部楼层 | 阅读模式

    ServeConn

    默认指定了gob的解码编码器,然后调用ServeCodec

    ServeCodec

    持续监听传入的对象,一直到停止接受后,主动关闭通信对象
    通常用于tcp通信

    // 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协议

    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
    }
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表