package main
import (
"fmt"
"log"
"net"
"sync"
"time"
)
const(
address = "localhost:502"
)
//方法的嵌套!!!!!!!!!!!!!!!!!!!!!!!!!
func main() {
handler := NewTCPClientHandler(address) /*TCPClientHandler初始化一个 对象 的参数*/
/*handler.Encode()*/
fmt.Printf("%+v\n", handler)
//&{tcpPackager:{transactionId:0 SlaveId:0} tcpTransporter:{Address:localhost:502 Timeout:10s IdleTimeout:1m0s Logger:<nil> mu:{state:0 sema:0} conn:<nil> closeTimer:<nil> lastActivity:{wall:0 ext:0 loc:<nil>}}}
/*结构体*TCPClientHandler赋值给接口ClientHandler*/
//指针对象赋值给接口,接口方法必须是指针对象方法
NewClient(handler) /*初始化TCPClientHandler对象*/
/*NewClient(handler).ReadHoldingRegisters()*/
}
type Packager interface {
Encode() (adu []byte, err error)
Decode(adu []byte) (err error)
Verify(aduRequest []byte, aduResponse []byte) (err error)
}
// Transporter specifies the transport layer.
type Transporter interface {
Send11(aduRequest []byte) (aduResponse []byte, err error)
}
type sclient struct {
packager Packager //接口作为结构体参数
transporter Transporter //
}
type ClientHandler interface {
Packager //编码解码接口
Transporter //发送接口
}
func NewClient(handler ClientHandler) Client { /*对象赋值给接口*/
//参数传递时对象赋值给接口,就可以调用对象的方法了
/*handler 此时是ClientHandler的一个变量,一旦由外部对象调用,则变成了对象*/
fmt.Println("_______",handler)
fmt.Printf("ClientHandler接口转变成了%T对象\n",handler)
/*对象赋值给接口----返回接口的指针对象*/
return &sclient{packager: handler, transporter: handler} /*返回该接口对象*/
/*将对象handler赋值给接口packager后,此时packager=对象了*/
/*将结构体&sclient赋值给接口Client里面都是对读写方法的定义可以都不写*/
}
type Client interface {
}
func NewTCPClientHandler(address string) *TCPClientHandler {
h := &TCPClientHandler{} //结构体是非引用传递,需要指针对象
h.Address = address //IP地址+端口
h.Timeout = tcpTimeout
h.IdleTimeout = tcpIdleTimeout
return h
}
const (
tcpProtocolIdentifier uint16 = 0x0000
// Modbus Application Protocol
tcpHeaderSize = 7
tcpMaxLength = 260
// Default TCP timeout is not set
tcpTimeout = 10 * time.Second
tcpIdleTimeout = 60 * time.Second
)
// tcpPackager implements Packager interface.
type tcpPackager struct {
// For synchronization between messages of server & sclient
transactionId uint32 /*用于服务器和客户端消息之间的同步*/
// Broadcast address is 0
SlaveId byte /*??0为广播*/
}
// tcpTransporter implements Transporter interface.
type tcpTransporter struct {
// Connect string
Address string
// Connect & Read timeout
Timeout time.Duration
// Idle timeout to close the connection
IdleTimeout time.Duration
// Transmission logger
Logger *log.Logger
// TCP connection
mu sync.Mutex
conn net.Conn
closeTimer *time.Timer
lastActivity time.Time
}
// TCPClientHandler implements Packager and Transporter interface.
type TCPClientHandler struct {
//结构体嵌套。
tcpPackager //编码+解码+检查序列号3个方法
tcpTransporter //下发数据1个方法
}
对象赋值给结构体
猜你喜欢
转载自blog.csdn.net/weixin_42544051/article/details/85264998
今日推荐
周排行