package service import ( "context" "fmt" "github.com/grandcat/zeroconf" "slices" "work_cation/cfg" "work_cation/models" ) type zeroconfService struct { server *zeroconf.Server onlines []models.Online } 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() ([]models.Online, error) { return s.onlines, nil } func (s *zeroconfService) GetOnline(id string) *models.Online { for _, online := range s.onlines { if online.ID == id { return &online } } return nil } func (s *zeroconfService) StartFindService() error { resolver, err := zeroconf.NewResolver(nil) if err != nil { return err } allEntries := make(chan *zeroconf.ServiceEntry) go func(results <-chan *zeroconf.ServiceEntry) { for entry := range results { fmt.Println(entry.AddrIPv4, entry.ServiceInstanceName()) if entry.ServiceInstanceName() == fmt.Sprintf("%s._http._tcp.local.", cfg.T.ZeroconfKey) { online, err := models.NewOnline(entry) if err != nil { continue } delOnlines := slices.DeleteFunc(s.onlines, func(item models.Online) bool { return item.ID == online.ID }) s.onlines = append(delOnlines, *online) } } }(allEntries) err = resolver.Browse(context.Background(), "_http._tcp", "local.", allEntries) return err }