gtcp
模块提供了简便易用的 gtcp.Conn
链接操作对象。
使用方式:
import "github.com/gogf/gf/net/gtcp"
接口文档:
https://godoc.org/github.com/gogf/gf/net/gtcp
type Conn
func NewConn(addr string, timeout ...int) (*Conn, error)
func NewConnByNetConn(conn net.Conn) *Conn
func NewConnKeyCrt(addr, crtFile, keyFile string) (*Conn, error)
func NewConnTLS(addr string, tlsConfig *tls.Config) (*Conn, error)
func (c *Conn) Close() error
func (c *Conn) LocalAddr() net.Addr
func (c *Conn) Recv(length int, retry ...Retry) ([]byte, error)
func (c *Conn) RecvLine(retry ...Retry) ([]byte, error)
func (c *Conn) RecvWithTimeout(length int, timeout time.Duration, retry ...Retry) ([]byte, error)
func (c *Conn) RemoteAddr() net.Addr
func (c *Conn) Send(data []byte, retry ...Retry) error
func (c *Conn) SendRecv(data []byte, receive int, retry ...Retry) ([]byte, error)
func (c *Conn) SendRecvWithTimeout(data []byte, receive int, timeout time.Duration, retry ...Retry) ([]byte, error)
func (c *Conn) SendWithTimeout(data []byte, timeout time.Duration, retry ...Retry) error
func (c *Conn) SetDeadline(t time.Time) error
func (c *Conn) SetRecvBufferWait(bufferWaitDuration time.Duration)
func (c *Conn) SetRecvDeadline(t time.Time) error
func (c *Conn) SetSendDeadline(t time.Time) error
写入操作
TCP通信写入操作由 Send
方法实现,并提供了错误重试的机制,由第二个非必需参数 retry
提供。需要注意的是 Send
方法不带任何的缓冲机制,也就是说每调用一次 Send
方法将会立即调用底层的TCP Write方法写入数据(缓冲机制依靠系统底层实现)。因此,如果想要进行输出缓冲控制,请在业务层进行处理。
在进行TCP写入时,可靠的通信场景下往往是一写一读,即 Send
成功之后接着便开始 Recv
获取目标的反馈结果。因此 gtcp.Conn
也提供了方便的 SendRecv
方法。
读取操作
TCP通信读取操作由 Recv
方法实现,同时也提供了错误重试的机制,由第二个非必需参数 retry
提供。 Recv
方法提供了内置的读取缓冲控制,读取数据时可以指定读取的长度(由 length
参数指定),当读取到指定长度的数据后将会立即返回。如果 length < 0
那么将会读取所有可读取的缓冲区数据并返回。当 length = 0
时表示获取一次缓冲区的数据后立即返回。
如果使用 Recv(-1)
可以读取所有缓冲区可读数据(长度不定,如果发送的数据包太长有可能会被截断),但需要注意包的解析问题,容易产生非完整包的情况。这个时候,业务层需要根据既定的数据包结构自己负责包的完整性处理。推荐使用后续介绍的 简单协议
通过 SendPkg
/ RecvPkg
来实现消息包的发送/接收,具体请查看后续章节。
超时处理
gtcp.Conn
对TCP通信时的数据写入和读取提供了超时处理,通过方法中的 timeout
参数指定,这块比较简单,不过多阐述。
我们接下来通过通过几个例子来看看如何使用 gtcp.Conn
对象。