func main() { flag.Parse() if flag.NArg() < 1 { fmt.Println("Usage: pingpong5 num_runs hideTrace") return } else if flag.NArg() > 1 { showPingPong = false } numRuns, _ := strconv.Atoi(flag.Arg(0)) done := make(chan bool) connNow := make(chan bool) //start two goroutines to setup a unix sock connection //connect two routers thru unix sock //and then hook up Pinger and Ponger to the routers go func() { //setup Pinger sock conn //wait for ponger up <-connNow //set up an io conn to ponger thru tcp sock conn, _ := net.Dial("tcp", "", "[::]:9099") fmt.Println("ping conn up") //create router and connect it to io conn rot := router.New(router.StrID(), 32, router.BroadcastPolicy) rot.ConnectRemote(conn, router.GobMarshaling) //hook up Pinger and Ponger newPinger(rot, done, numRuns) }() go func() { //setup Ponger sock conn //wait to set up an io conn thru tcp sock l, _ := net.Listen("tcp", ":9099") connNow <- true //notify pinger that ponger's ready to accept conn, _ := l.Accept() fmt.Println("pong conn up") //create router and connect it to io conn rot := router.New(router.StrID(), 32, router.BroadcastPolicy) rot.ConnectRemote(conn, router.GobMarshaling) //hook up Ponger newPonger(rot, done) }() //wait for ping-pong to finish <-done <-done }
func main() { flag.Parse() if flag.NArg() < 1 { fmt.Println("Usage: pingpong3 num_runs hideTrace") return } else if flag.NArg() > 1 { showPingPong = false } numRuns, _ := strconv.Atoi(flag.Arg(0)) //alloc two routers to connect them rot1 := router.New(router.StrID(), 32, router.BroadcastPolicy) rot2 := router.New(router.StrID(), 32, router.BroadcastPolicy) rot1.Connect(rot2) done := make(chan bool) //hook up Pinger and Ponger newPinger(rot1, done, numRuns) newPonger(rot2, done) //wait for ping-pong to finish <-done <-done }
func NewServant(n string, role ServantRole, done chan bool) *Servant { s := new(Servant) s.Rot = router.New(router.StrID(), 32, router.BroadcastPolicy /*, n, router.ScopeLocal*/) s.role = role s.name = n //start system tasks, ServiceTask will be created when clients connect NewSysMgrTask(s.Rot, n, role) NewDbTask(s.Rot, n, role) NewFaultMgrTask(s.Rot, n, role) //run Servant mainloop to wait for client connection go s.Run(done) return s }
func main() { l, err := net.Listen("tcp", ":0") if err != nil { fmt.Println(err) return } fmt.Println(l.Addr().String()) subjMap := make(map[string]*Subject) rot := router.New(router.StrID(), 32, router.BroadcastPolicy /*, "chatsrv", router.ScopeLocal*/) //start server mainloop in a separate goroutine, and recv client conn in main goroutine go func() { //subscribe to remote publications, so learn what subjects are created pubChan := make(chan *router.IdChanInfoMsg) //attach a recv chan with a "chan BindEvent" //this recv chan will not be closed when all senders detach bindChan := make(chan *router.BindEvent, 1) rot.AttachRecvChan(rot.NewSysID(router.PubId, router.ScopeRemote), pubChan, bindChan) //stopChan to notify when all people leave a subject stopChan := make(chan string, 36) for { select { case idstr := <-stopChan: subjMap[idstr] = nil, false case pub := <-pubChan: //process recved client publication of subjects for _, v := range pub.Info { id := v.Id.(*router.StrId) //get the real id type subj, ok := subjMap[id.Val] if ok { continue } fmt.Printf("add subject: %v\n", id.Val) //add a new subject with ScopeRemote, so that msgs are forwarded //to peers in connected routers id.ScopeVal = router.ScopeRemote id.MemberVal = router.MemberLocal subj = newSubject() subjMap[id.Val] = subj //subscribe to new subjects, forward recved msgs to other rot.AttachSendChan(id, subj.sendChan) rot.AttachRecvChan(id, subj.recvChan) //start forwarding go func(subjname string) { for val := range subj.recvChan { fmt.Printf("chatsrv forward: subject[%v], msg[%s]\n", subjname, val) subj.sendChan <- val } stopChan <- subjname fmt.Printf("chatsrv stop forwarding for : %v\n", subjname) }(id.Val) } } } }() //keep accepting client conn and connect local router to it for { conn, err := l.Accept() if err != nil { fmt.Println(err) return } fmt.Println("one client connect") _, err = rot.ConnectRemote(conn, router.JsonMarshaling) if err != nil { fmt.Println(err) return } } //in fact never reach here rot.Close() l.Close() }