68 lines
1.5 KiB
Go
68 lines
1.5 KiB
Go
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) {
|
|
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
|
|
}
|