textproto包 textproto.go学习

textproto.go

1.概括的说 包textproto实现泛型支持基于文本的请求/响应 支持的协议 HTTP, NNTP, SMTP.
2.包提供了以下的内容:

–ERROR,这代表一个数字错误响应从服务器。
–Pipeline 管道 管理管线式客户机请求和响应。
–Reader,读数用code标识的,key:value形式化的head信息, ( 整个文本有自己的结束标识符 ,每一行也有结束标识符)
–writer,将读取到行尾,文件尾的整个文本输出出去。
–Conn 封装了 Reader ,writer , pipeline ,可以使用它做一个简单的网络连接

3.具体来看看几个结构体/函数的定义
ERROR的定义

//从服务端响应错误
   type Error struct {
        Code int
        Msg  string
}

函数定义 
    func (e *Error) Error() string

Pipeline 结构体的定义

  type Pipeline struct {
    mu       sync.Mutex   // Mutex主要用于多线程编程   可以理解为基于锁的机制 
     //一般的用法是用于串行化对临界区代码的访问,保证这段代码不会被并行的运行
    id       uint     //Pipeline 编号
    request  sequencer     //可以理解为一个消息序列
    response sequencer     
}
// pipeline的方法调用 
    func (p *Pipeline) EndRequest(id uint)
    func (p *Pipeline) EndResponse(id uint)
    func (p *Pipeline) Next() uint  //返回下一个 Pipeline ID
    func (p *Pipeline) StartRequest(id uint)
    func (p *Pipeline) StartResponse(id uint)

关于 pipeline先说这么多,详细的可以在专门pipeline说明中去查看

Reader 结构体定义

在定义Reader这个结构体之前先看看什是 dot Encoding
dot encoding是一个用正在文本协议中的数据块的通用框架 ,比如snmp
文本都是由行组成,每一行尾都有分隔符 保函 “\r\n”. 而整个大文本也有自己的标识符 “\r\n” 这个结束符就可以把它叫做dot
而而上一行的dot又可以看做是下一行的开始 标识符 ,这样就避免了制度了一行,而没有读完整个文本
所以当有一行数据的时候 他的起始位置也是有一个 dot 的
再来看看 dot Decode
decoded 是发生在 Reader 调用reader的时候 重写了”\r\n”. 为”\n”.
如果dot丢失 ,读取文件失败,会抛出 io.EOF
自己的理解,有问题可以指正

//在定义Reader这个结构体之前先看看什是 dot Encoding吧
//
  type Reader struct {
    R   *bufio.Reader
    dot *dotReader   
    buf []byte // a re-usable buffer for readContinuedLineSlice 
}
 // 方法定义
    func NewReader(r *bufio.Reader) *Reader  // 为了避免服务攻击 , bufio.Reader 要从一个有大小的 io.LimitReader读取 ,或者是从一个有大小限制的 response读取
    func (r *Reader) DotReader() io.Reader
    func (r *Reader) ReadCodeLine(expectCode int) (code int, message string, err error)
    func (r *Reader) ReadContinuedLine() (string, error)
    func (r *Reader) ReadContinuedLineBytes() ([]byte, error)
    func (r *Reader) ReadDotBytes() ([]byte, error)
    func (r *Reader) ReadDotLines() ([]string, error)
    func (r *Reader) ReadLine() (string, error)
    func (r *Reader) ReadLineBytes() ([]byte, error)
    func (r *Reader) ReadMIMEHeader() (MIMEHeader, error)
    func (r *Reader) ReadResponse(expectCode int) (code int, message string, err error)

writer结构体定义

 type Writer struct {
    W   *bufio.Writer
    dot *dotWriter
}
//实现的方法
    func NewWriter(w *bufio.Writer) *Writer
    func (w *Writer) DotWriter() io.WriteCloser
    func (w *Writer) PrintfLine(format string, args ...interface{}) error

做了这么多准备工作 ,最重要 con 登场了

  type Conn struct {
    Reader
    Writer
    Pipeline
    conn io.ReadWriteCloser
    //实现的方法
    func Dial(network, addr string) (*Conn, error) //给一个地址,网络 创建一个连接
    func NewConn(conn io.ReadWriteCloser) *Conn
    func (c *Conn) Close() error
    func (c *Conn) Cmd(format string, args ...interface{}) (id uint, err error)
    // 发送一个命令,交给队列处理
}

MIMEHeader

MIMEHeader代表MIME-style的 key:value的映射集

 type MIMEHeader map[string][]string
 //实现的方法
    func (h MIMEHeader) Add(key, value string)
    func (h MIMEHeader) Del(key string)
    func (h MIMEHeader) Get(key string) string
    func (h MIMEHeader) Set(key, value string)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章