频道栏目
首页 > 程序开发 > 软件开发 > 其他 > 正文
grpc-go,双向流模式中服务器主动关闭stream
2019-01-31 09:55:40           
收藏   我要投稿
在grpc的编码中发现客户端stream流有方法。CloseSend() error

客户端如果想主动关闭连接直接调用此方法即可关闭,但是服务端对应的ServerStream没有关闭的方法,最后Google一下发现github grpc 项目中有对应的解答:https://github.com/grpc/grpc-go/issues/444

很简单服务端只需要跳出循环即可断开连接,下面贴出我的解决方案:

主动关闭的方法,向chan发送标志位。

func (s *Grpc_session) Close() {

close(s.WriteChan)

// 没有找到Serverstream关闭的方法,只能发送chan退出循环

s.exit <- true

}

这里直接用select接受chan,如果接受到则退出。

func (s *Grpc_session) Run() error {

for {

select {

case <-s.exit:

return nil

default:

in, err := s.Comminute_client.Recv()

if err == io.EOF {

fmt.Println("read done")

return nil

}

if err != nil {

fmt.Errorf("ERROR : %v", err)

return err

}

f, exit := func_manage.FunManage.Get(in.GetName())

if exit != nil {

fmt.Errorf("%v has not Register!", in.GetName())

continue

}

switch f.(type) {

case func(...interface{}):

go f.(func(...interface{}))(in, s)

case func(...interface{}) interface{}:

case func(...interface{}) []interface{}:

default:

fmt.Println("function id : definition of function is invalid")

}

}

}

}

在测试中,退出循环时客户端也收到服务端断开连接的标志,证明方案可行~~

点击复制链接 与好友分享!回本站首页
上一篇:kafka顺序消息
下一篇:文件编解码编码,字符串编解码
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站