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() stringPipeline 结构体的定义
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)