package service import ( "context" "fmt" "github.com/grandcat/zeroconf" "time" "work_cation/cfg" "work_cation/models" ) type zeroconfService struct { server *zeroconf.Server } var Zeroconf = &zeroconfService{} // Register 注册被发现服务 func (s *zeroconfService) Register(user *models.Users) error { if s.server != nil { return nil // already registered } server, err := zeroconf.Register(cfg.T.ZeroconfKey, "_http._tcp", "local.", cfg.T.ZeroconfPort, models.UserTOnlineList(user), nil) if err != nil { return err } s.server = server return nil } func (s *zeroconfService) Close() { if s.server != nil { s.server.Shutdown() s.server = nil } } // FindService 查找被发现服务 func (s *zeroconfService) FindService() (chan *models.Online, error) { resolver, err := zeroconf.NewResolver(nil) if err != nil { return nil, err } allEntries := make(chan *zeroconf.ServiceEntry) useEntries := make(chan *models.Online) go func(results <-chan *zeroconf.ServiceEntry) { for entry := range results { if entry.ServiceInstanceName() == fmt.Sprintf("%s._http._tcp.local.", cfg.T.ZeroconfKey) { //fmt.Printf("发现服务: %s \nIP:%s:%d \nInfo: %v\n", entry.ServiceInstanceName(), entry.AddrIPv4, entry.Port, entry.Text) online, err := models.NewOnline(entry) if err != nil { continue } useEntries <- online } } }(allEntries) ctx, cancel := context.WithCancel(context.Background()) err = resolver.Browse(ctx, "_http._tcp", "local.", allEntries) if err != nil { cancel() return nil, err } time.AfterFunc(10*time.Second, cancel) return useEntries, nil }