zoukankan      html  css  js  c++  java
  • 分析下golang里的yamux/conn/流的概念

    事情的起点应该是网络包中的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 address

    RemoteAddr() Addr returns the remote net work address

    SetDeadline(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的特性是包括读取完了之后,数据流就失效了。

  • 相关阅读:
    个性化联邦学习算法框架发布,赋能AI药物研发
    ES入门 (2) 数据格式/类型
    ES入门 (1) 使用基础(1)安装(1) WIN 单机
    Java 之 JDBC:(十)Spring的JDBCTemplate
    Java 之 JDBC:(九)Apache-DBUtils实现CRUD操作
    Java 之 JDBC:(八)数据库连接池
    Java 之 JDBC:(七)DAO及相关实现类
    Java 之 JDBC:(六)数据库事务
    Java 之 JDBC:(五)批量插入
    第七节:循环结构
  • 原文地址:https://www.cnblogs.com/honpey/p/14287036.html
Copyright © 2011-2022 走看看