transx/communicator/sender.go

80 lines
1.5 KiB
Go

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()
}