add orm function
This commit is contained in:
		
							parent
							
								
									996f94eef0
								
							
						
					
					
						commit
						9065a12b99
					
				
							
								
								
									
										13
									
								
								client.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								client.go
									
									
									
									
									
								
							| @ -15,7 +15,6 @@ import ( | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| //var nowd int64 | ||||
| type ClientCommon struct { | ||||
| 	alive                      atomic.Value | ||||
| 	status                     Status | ||||
| @ -218,7 +217,9 @@ func (c *ClientCommon) readMessage() { | ||||
| 		} | ||||
| 		data := make([]byte, 8192) | ||||
| 		if c.maxReadTimeout.Seconds() != 0 { | ||||
| 			c.conn.SetReadDeadline(time.Now().Add(c.maxReadTimeout)) | ||||
| 			if err := c.conn.SetReadDeadline(time.Now().Add(c.maxReadTimeout)); err != nil { | ||||
| 				//TODO:ALERT | ||||
| 			} | ||||
| 		} | ||||
| 		readNum, err := c.conn.Read(data) | ||||
| 		if err == os.ErrDeadlineExceeded { | ||||
| @ -314,8 +315,8 @@ func (c *ClientCommon) dispatchMsg(message Message) { | ||||
| 			c.noFinSyncMsgPool.Delete(message.ID) | ||||
| 			return | ||||
| 		} | ||||
| 		return | ||||
| 		//fallthrough | ||||
| 		//return | ||||
| 		fallthrough | ||||
| 	default: | ||||
| 	} | ||||
| 	callFn := func(fn func(*Message)) { | ||||
| @ -411,7 +412,7 @@ func (c *ClientCommon) sendWait(msg TransferMsg, timeout time.Duration) (Message | ||||
| 		c.noFinSyncMsgPool.Delete(data.TransferMsg.ID) | ||||
| 		return Message{}, os.ErrDeadlineExceeded | ||||
| 	case <-c.stopCtx.Done(): | ||||
| 		return Message{}, errors.New("Service shutdown") | ||||
| 		return Message{}, errors.New("service shutdown") | ||||
| 	case msg, ok := <-data.Reply: | ||||
| 		if !ok { | ||||
| 			return msg, os.ErrInvalid | ||||
| @ -434,7 +435,7 @@ func (c *ClientCommon) sendCtx(msg TransferMsg, ctx context.Context) (Message, e | ||||
| 		c.noFinSyncMsgPool.Delete(data.TransferMsg.ID) | ||||
| 		return Message{}, os.ErrDeadlineExceeded | ||||
| 	case <-c.stopCtx.Done(): | ||||
| 		return Message{}, errors.New("Service shutdown") | ||||
| 		return Message{}, errors.New("service shutdown") | ||||
| 	case msg, ok := <-data.Reply: | ||||
| 		if !ok { | ||||
| 			return msg, os.ErrInvalid | ||||
|  | ||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @ -3,7 +3,7 @@ module b612.me/notify | ||||
| go 1.16 | ||||
| 
 | ||||
| require ( | ||||
| 	b612.me/starcrypto v0.0.1 | ||||
| 	b612.me/starcrypto v0.0.2 | ||||
| 	b612.me/stario v0.0.5 | ||||
| 	b612.me/starnet v0.1.3 | ||||
| ) | ||||
|  | ||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							| @ -1,5 +1,5 @@ | ||||
| b612.me/starcrypto v0.0.1 h1:xGngzXPUrVbqtWzNw2e+0eWsdG7GG1/X+ONDGIzdriI= | ||||
| b612.me/starcrypto v0.0.1/go.mod h1:hz0xRnfWNpYOlVrIPoGrQOWPibq4YiUZ7qN5tsQbzPo= | ||||
| b612.me/starcrypto v0.0.2 h1:aRf1HcqK8GqHYxLAhWfFC4W/EqQLEFNEmxsBu3wG30o= | ||||
| b612.me/starcrypto v0.0.2/go.mod h1:hz0xRnfWNpYOlVrIPoGrQOWPibq4YiUZ7qN5tsQbzPo= | ||||
| b612.me/stario v0.0.5 h1:Q1OGF+8eOoK49zMzkyh80GWaMuknhey6+PWJJL9ZuNo= | ||||
| b612.me/stario v0.0.5/go.mod h1:or4ssWcxQSjMeu+hRKEgtp0X517b3zdlEOAms8Qscvw= | ||||
| b612.me/starnet v0.1.3 h1:UjY6M96gdPdJtxnQGzCttqSwFw93sDZSHiIGtdOlFfk= | ||||
|  | ||||
							
								
								
									
										29
									
								
								msg.go
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								msg.go
									
									
									
									
									
								
							| @ -7,7 +7,7 @@ import ( | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| 	"os" | ||||
| 	"sync" | ||||
| 	"reflect" | ||||
| 	"sync/atomic" | ||||
| 	"time" | ||||
| ) | ||||
| @ -45,7 +45,6 @@ type Message struct { | ||||
| 	ServerConn Client | ||||
| 	TransferMsg | ||||
| 	Time time.Time | ||||
| 	sync.Mutex | ||||
| } | ||||
| 
 | ||||
| type WaitMsg struct { | ||||
| @ -475,3 +474,29 @@ func MustToMsgVal(val interface{}) MsgVal { | ||||
| 	} | ||||
| 	return d | ||||
| } | ||||
| 
 | ||||
| func (m MsgVal) Orm(stu interface{}) error { | ||||
| 	inf, err := m.ToInterface() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	t := reflect.TypeOf(stu) | ||||
| 	if t.Kind() != reflect.Ptr { | ||||
| 		return errors.New("interface not writable(pointer wanted)") | ||||
| 	} | ||||
| 	if !reflect.ValueOf(stu).Elem().CanSet() { | ||||
| 		return errors.New("interface not writable") | ||||
| 	} | ||||
| 	it := reflect.TypeOf(inf) | ||||
| 	if t.Elem().Kind() != it.Kind() { | ||||
| 		return fmt.Errorf("interface{} kind is %v,not %v", t.Elem().Kind(), it.Kind()) | ||||
| 	} | ||||
| 	if t.Elem().Name() != it.Name() { | ||||
| 		return fmt.Errorf("interface{} name is %v,not %v", t.Elem().Name(), it.Name()) | ||||
| 	} | ||||
| 	if t.Elem().String() != it.String() { | ||||
| 		return fmt.Errorf("interface{} string is %v,not %v", t.Elem().String(), it.String()) | ||||
| 	} | ||||
| 	reflect.ValueOf(stu).Elem().Set(reflect.ValueOf(inf)) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
							
								
								
									
										96
									
								
								msg_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								msg_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,96 @@ | ||||
| package notify | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"testing" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| func TestMsgEnDeCode(t *testing.T) { | ||||
| 	Register(HelloMessage{}) | ||||
| 	Register(Error{}) | ||||
| 	go ServerRun(time.Second * 30) | ||||
| 	time.Sleep(time.Second * 2) | ||||
| 	ClientRun(time.Second * 35) | ||||
| } | ||||
| 
 | ||||
| type Error struct { | ||||
| 	Msg string | ||||
| } | ||||
| 
 | ||||
| func (e Error) Error() string { | ||||
| 	return e.Msg | ||||
| } | ||||
| 
 | ||||
| type WorldMessage struct { | ||||
| 	Port   int | ||||
| 	MyCode string | ||||
| 	MyInfo []int | ||||
| 	Err    error | ||||
| } | ||||
| 
 | ||||
| type HelloMessage struct { | ||||
| 	ID      string | ||||
| 	MyMap   map[string]string | ||||
| 	MySlice []int | ||||
| 	World   WorldMessage | ||||
| } | ||||
| 
 | ||||
| func ClientRun(stopTime time.Duration) { | ||||
| 	c := NewClient() | ||||
| 	err := c.Connect("tcp", "127.0.0.1:23456") | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	c.SetLink("msg", func(msg *Message) { | ||||
| 		var hi HelloMessage | ||||
| 		err := msg.Value.Orm(&hi) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		fmt.Printf("recv info from server,struct detail is %+v\n", hi) | ||||
| 	}) | ||||
| 	timer := time.NewTimer(stopTime) | ||||
| 	for { | ||||
| 		select { | ||||
| 		case <-timer.C: | ||||
| 			c.Stop() | ||||
| 			return | ||||
| 		case <-time.After(time.Second * 2): | ||||
| 			fmt.Println("client msg sent", c.SendObj("msg", HelloMessage{ | ||||
| 				ID:      "client", | ||||
| 				MyMap:   map[string]string{"hello": "world"}, | ||||
| 				MySlice: []int{int(time.Now().Unix())}, | ||||
| 				World: WorldMessage{ | ||||
| 					Port:   520, | ||||
| 					MyCode: "b612", | ||||
| 					MyInfo: []int{0, 1, 2, 3}, | ||||
| 					Err:    Error{Msg: "Hello World"}, | ||||
| 				}, | ||||
| 			})) | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func ServerRun(stopTime time.Duration) { | ||||
| 	s := NewServer() | ||||
| 	err := s.Listen("tcp", "127.0.0.1:23456") | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	s.SetLink("msg", func(msg *Message) { | ||||
| 		var hi HelloMessage | ||||
| 		err := msg.Value.Orm(&hi) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		fmt.Printf("recv info from client:%v,struct detail is %+v\n", msg.ClientConn.GetRemoteAddr(), hi) | ||||
| 		hi.ID = "server" | ||||
| 		hi.World.Port = 666 | ||||
| 		hi.MySlice = append(hi.MySlice, 1, 1, 2, 7) | ||||
| 		msg.ReplyObj(hi) | ||||
| 	}) | ||||
| 	<-time.After(stopTime) | ||||
| 	s.Stop() | ||||
| } | ||||
							
								
								
									
										18
									
								
								server.go
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								server.go
									
									
									
									
									
								
							| @ -241,7 +241,7 @@ func (s *ServerCommon) loadMessage() { | ||||
| 			s.mu.RLock() | ||||
| 			for _, v := range s.clientPool { | ||||
| 				wg.Add(1) | ||||
| 				go func() { | ||||
| 				go func(v *ClientConn) { | ||||
| 					defer wg.Done() | ||||
| 					v.sayGoodByeForTU() | ||||
| 					v.alive.Store(false) | ||||
| @ -252,7 +252,7 @@ func (s *ServerCommon) loadMessage() { | ||||
| 					} | ||||
| 					v.stopFn() | ||||
| 					s.removeClient(v) | ||||
| 				}() | ||||
| 				}(v) | ||||
| 			} | ||||
| 			s.mu.RUnlock() | ||||
| 			select { | ||||
| @ -343,8 +343,8 @@ func (s *ServerCommon) dispatchMsg(message Message) { | ||||
| 			return | ||||
| 		} | ||||
| 		//just throw | ||||
| 		return | ||||
| 		//fallthrough | ||||
| 		//return | ||||
| 		fallthrough | ||||
| 	default: | ||||
| 	} | ||||
| 	callFn := func(fn func(*Message)) { | ||||
| @ -377,7 +377,9 @@ func (s *ServerCommon) sendTU(c *ClientConn, msg TransferMsg) (WaitMsg, error) { | ||||
| 	data = c.msgEn(c.SecretKey, data) | ||||
| 	data = s.queue.BuildMessage(data) | ||||
| 	if c.maxWriteTimeout.Seconds() != 0 { | ||||
| 		c.tuConn.SetWriteDeadline(time.Now().Add(c.maxWriteTimeout)) | ||||
| 		if err := c.tuConn.SetWriteDeadline(time.Now().Add(c.maxWriteTimeout)); err != nil { | ||||
| 			return WaitMsg{}, err | ||||
| 		} | ||||
| 	} | ||||
| 	_, err = c.tuConn.Write(data) | ||||
| 	//fmt.Println("resend:", float64(time.Now().UnixNano()-nowd)/1000000) | ||||
| @ -416,7 +418,7 @@ func (s *ServerCommon) sendWait(c *ClientConn, msg TransferMsg, timeout time.Dur | ||||
| 		s.noFinSyncMsgPool.Delete(data.TransferMsg.ID) | ||||
| 		return Message{}, os.ErrDeadlineExceeded | ||||
| 	case <-s.stopCtx.Done(): | ||||
| 		return Message{}, errors.New("Service shutdown") | ||||
| 		return Message{}, errors.New("service shutdown") | ||||
| 	case msg, ok := <-data.Reply: | ||||
| 		if !ok { | ||||
| 			return msg, os.ErrInvalid | ||||
| @ -447,7 +449,7 @@ func (s *ServerCommon) sendCtx(c *ClientConn, msg TransferMsg, ctx context.Conte | ||||
| 		s.noFinSyncMsgPool.Delete(data.TransferMsg.ID) | ||||
| 		return Message{}, os.ErrClosed | ||||
| 	case <-s.stopCtx.Done(): | ||||
| 		return Message{}, errors.New("Service shutdown") | ||||
| 		return Message{}, errors.New("service shutdown") | ||||
| 	case msg, ok := <-data.Reply: | ||||
| 		if !ok { | ||||
| 			return msg, os.ErrInvalid | ||||
| @ -626,7 +628,7 @@ func (s *ServerCommon) GetClient(id string) *ClientConn { | ||||
| func (s *ServerCommon) GetClientLists() []*ClientConn { | ||||
| 	s.mu.RLock() | ||||
| 	defer s.mu.RUnlock() | ||||
| 	var list []*ClientConn = make([]*ClientConn, 0, len(s.clientPool)) | ||||
| 	var list = make([]*ClientConn, 0, len(s.clientPool)) | ||||
| 	for _, v := range s.clientPool { | ||||
| 		list = append(list, v) | ||||
| 	} | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user