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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章