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)