package communicator import ( "log" "github.com/TransX/tscipher" ) type Sender interface { //SendData(carrier *Carrier) (n int, err error) Send() (n int, err error) Close() } func NewNormalSender(carrier *tscipher.Carrier) *NormalSender { r := new(NormalSender) r.carrier = carrier return r } type NormalSender struct { Sender carrier *tscipher.Carrier } func (this *NormalSender) Send() (n int, err error) { carrier := this.carrier msg, nByte := carrier.Msg.Get() if len(msg) < nByte { log.Panic("Cache of send is too small") } // if carrier.Cipher == nil { // n, err = carrier.Conn.Write(msg[:nByte]) // carrier.Cache.Put(make([]byte, 1024*4), 1024*4) // return // } encrypedByte, err := carrier.Cipher.Encrypt(msg[:nByte]) if err != nil { n = 0 return } //打包 wraped := tscipher.WrapPackage(encrypedByte[:nByte]) n, err = carrier.Conn.Write(wraped) carrier.Cache.Put(make([]byte, 1024*4), 1024*4) return } func (this *NormalSender) Close() { this.carrier.Conn.Close() } func NewDirectSender(carrier *tscipher.Carrier) *DirectSender { r := new(DirectSender) r.carrier = carrier return r } type DirectSender struct { Sender carrier *tscipher.Carrier } func (this *DirectSender) Send() (n int, err error) { carrier := this.carrier msg, nByte := carrier.Msg.Get() if len(msg) < nByte { log.Panic("Cache of send is too small") } n, err = carrier.Conn.Write(msg[:nByte]) carrier.Cache.Put(make([]byte, 1024*4), 1024*4) return } func (this *DirectSender) Close() { this.carrier.Conn.Close() }