| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | package networkimport (	"io"	"net"	"time")// Dial 拨号. network 可选 NetTCP 或 NetUDP 表示使用 TCP 或 UDP 协议, address 为服务器地址// Dial 实现 net.Conn 接口func Dial(network, address string, logger Logger) (net.Conn, error) {	return DialTimout(network, address, DefaultDialTimout, logger)}// DialTimout 拨号并指定超时时间func DialTimout(network, address string, timout time.Duration, logger Logger) (net.Conn, error) {	conn, err := net.DialTimeout(network, address, timout)	if err != nil {		return nil, err	}	switch network {	case NetTCP:		return NewTCPClient(conn, logger), nil	case NetUDP:		fallthrough	default:		return conn, nil	}}func Listen(network, address string) (net.Listener, error) {	switch network {	case NetTCP:		return ListenTCP(network, address)	default:		return net.Listen(network, address)	}}func ListenTCP(network, address string) (*TCPListener, error) {	tcpAddr, err := net.ResolveTCPAddr(network, address)	if err != nil {		return nil, err	}	listener, err := net.ListenTCP(network, tcpAddr)	if err != nil {		return nil, err	}	return &TCPListener{Listener: listener}, nil}// NewModbusClient 作为一个中间件连接上游前端与下游客户端// 1. 工作模式为前端调用 Write 将数据保存至 *ModbusClient.Recv 接口内// 2. *ModbusClient 读取 Recv 内的数据并发送至 Conn, 并将 Conn 返回的数据保存至 Transmit,// 3. 后续前端调用 Read 可读取 Conn 返回的数据// 当超过一定时间没有主动调用 Write 后, 此时会 *ModbusClient 会主动调用 ModbusCreator 接口然后发送数据至 Conn, 然后重复步骤 2func NewModbusClient(conn net.Conn, data ModbusCreator, logger Logger) io.ReadWriteCloser {	return createModbusClient(conn, data, logger)}
 |