您好,欢迎来到尚车旅游网。
搜索
您的当前位置:首页分析下golang里的yamuxconn流的概念

分析下golang里的yamuxconn流的概念

来源:尚车旅游网
分析下golang⾥的yamuxconn流的概念

事情的起点应该是⽹络包中的net.conn

这个多路复⽤的意思是在⼀个tcp流上建⽴⼀个多路复⽤的应⽤,就像是⼀个⽂件

所以socket的特性是取出⼀个然后数据就从socket中删除了,yamuxserver做的是什么事情?其实就是典型的复⽤的逻辑,这个多路复⽤的⽤处应该是不⼤的吧?

conn是⼀个接⼝,只要提供如下函数:Read(b []bytes) (n int, err error)Write(b []bytes) (n int, err error)Close() error

LocalAddr() Addr // return the local network addressRemoteAddr() Addr returns the remote net work addressSetDeadline(t time.Time)SetReadDeadline(t time.Time)SetWriteDeadline(t time.Time)

只要能满⾜这⼏个函数,也就是说yamux在原来的链接上新创建了链接构造了⼏个虚拟的链接,所以最关键的就是,在⼀个端⼝上既能提供http的服务,⼜能提供grpc的服务,这样就没有必要提供新的端⼝了,还消耗端⼝,这个是有委托,其实最重要的就是这个Client函数,这个Client函数的输⼊是Conn,是⼀个正⼋经的数据流

// ReadWriteCloser is the interface that groups the basic Read, Write and Close methods.type ReadWriteCloser interface { Reader Writer Closer}

type Reader interface {

Read(p []byte) (n int, err error)}

type Writer interface {

Write(p []byte) (n int, err error)}

type Closer interface { Close() error}

Conn肯定是⼀种ReadWriteCloser,这是因为

yamux.Client返回的是什么?输⼊是⼀个conn,即readwritecloser(说⽩了,这就是⼀个fd),然后返回的是⼀个Session,Session是神马呀,创建了⼀个session之后,主要的⼯作就包括两部分了,主要是在后台启动了三个携程:recv send keepAlive这样三个携程⼀个负责发送,⼀个负责接受,⼀个负责是⼼跳,;然后在这个链接上构造http和server,其实直接去构造grpc也是可以的。

那么看下⽹络的net.Dial函数到底是什么?说⽩了,就是⼀个socket,这么说socket的特性是包括读取完了之后,数据流就失效了。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务