textproto包 textproto.go学习

本文介绍Go语言中的textproto包,该包提供了一种通用的方法来处理基于文本的协议,如HTTP、NNTP和SMTP。文章重点讲解了ERROR、Pipeline、Reader、Writer及Conn等核心结构体的功能与使用方法。

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)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值