net/textproto
2018-12-25 本文已影响13人
酷走天涯
textproto实现了对基于文本的请求/回复协议的一般性支持,包括HTTP、NNTP和SMTP
主要功能如下
- 1.格式化MIME头的键
- 2.去掉ascii编码字符切片的空白
- 3.MIMEHeader 功能介绍
- 4.创建网络连接
- 5.写入数据
- 6.读取数据
1.格式化MIME头的键
标准化 MIME 头: Accept-Encoding
字符连接的单词首字母大写 ,其余小写
func CanonicalMIMEHeaderKey(s string) string
textproto.CanonicalMIMEHeaderKey("content-type") // Content-Type
2.去掉ascii编码字符切片的空白
下面我们把一个文件的内容读取到data中
var data = []byte(" ddd ")
fmt.Println(len(textproto.TrimBytes(data))) // 3
下面这个方法剔除字符串空白
func TrimString(s string) string
3.MIMEHeader 功能介绍
mimeHeader := make(textproto.MIMEHeader)
mimeHeader.Set("Content-Type","text/plain")// 系统会自动转换为mime key标准格式
fmt.Println(mimeHeader)
mimeHeader.Del("content-type")
mimeHeader.Add("Content-Type","text/html")
fmt.Println(mimeHeader)
fmt.Println(mimeHeader.Get("content-type")) // 系统会自动转换为mime key标准格式
map[Content-Type:[text/plain]]
map[Content-Type:[text/html]]
text/html
4.创建网络连接
func Dial(network, addr string) (*Conn, error)
package main
import (
"net/textproto"
"fmt"
)
func main() {
conn,error := textproto.Dial("tcp","smtp.qq.com:25")
if error != nil {
fmt.Println(error)
}
fmt.Println(conn)
fmt.Println(conn.Reader)
fmt.Println(conn.Writer)
data,error := conn.Reader.ReadLine()
if error != nil {
fmt.Println(error)
}
fmt.Println(data)
}
image.png
我们与 smtp.qq.com:25 建立了连接,并且读取到了邮件服务器返回给我们的数据 220 smtp.qq.com Esmtp QQ Mail Server
5.写入数据
package main
import (
"net/textproto"
"fmt"
)
func main() {
conn,error := textproto.Dial("tcp","smtp.qq.com:25")
if error != nil {
fmt.Println(error)
}
data,error := conn.Reader.ReadLine()
if error != nil {
fmt.Println(error)
}
fmt.Println(data)
// 向服务器写入了一个HELO命令
conn.Writer.PrintfLine("HELO %s","xujie")
data,error = conn.Reader.ReadLine()
if error != nil {
fmt.Println(error)
}
//
fmt.Println(data)
}
220 smtp.qq.com Esmtp QQ Mail Server
250 smtp.qq.com
func (w *Writer) DotWriter() io.WriteCloser
DotWriter方法返回一个io.WriteCloser,用于将点编码文本写入w。返回的接口会在必要时添加转义点,将行尾的\n替换为\r\n,并在关闭时添加最后的.\r\n行。调用者必须在下一次调用w的方法前关闭该接口
返回的 io.WriteCloser
有一个close
方法,调用close可以关闭数据传输
6.读取数据
//ReadDotLines方法读取一个点编码文本块并返回一个包含解码后各行的切片,各行最后的\r\n或\n去掉
func (r *Reader) ReadDotLines() ([]string, error)
//ReadLine方法从r读取单行,去掉最后的\r\n或\n。
func (r *Reader) ReadLine() (string, error)
//ReadLineBytes类似ReadLine但返回[]byte切片。
func (r *Reader) ReadLineBytes() ([]byte, error)
//方法读取回复的状态码行,格式如下:
func (r *Reader) ReadCodeLine(expectCode int) (code int, message string, err error)