nanomsg.org/go/mangos/v2@v2.0.9-0.20200203084354-8a092611e461/examples/bus/bus.go (about) 1 // Copyright 2018 The Mangos Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use file except in compliance with the License. 5 // You may obtain a copy of the license at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // bus implements a bus example. 16 // 17 // To use: 18 // 19 // $ go build . 20 // $ url0=tcp://127.0.0.1:40890 21 // $ url1=tcp://127.0.0.1:40891 22 // $ url2=tcp://127.0.0.1:40892 23 // $ url3=tcp://127.0.0.1:40893 24 // $ ./bus node0 $url0 $url1 $url2 & node0=$! 25 // $ ./bus node1 $url1 $url2 $url3 & node1=$! 26 // $ ./bus node2 $url2 $url3 & node2=$! 27 // $ ./bus node3 $url3 $url0 & node3=$! 28 // $ sleep 5 29 // $ kill $node0 $node1 $node2 $node3 30 // 31 package main 32 33 import ( 34 "fmt" 35 "os" 36 "time" 37 38 "nanomsg.org/go/mangos/v2" 39 "nanomsg.org/go/mangos/v2/protocol/bus" 40 41 // register transports 42 _ "nanomsg.org/go/mangos/v2/transport/all" 43 ) 44 45 func die(format string, v ...interface{}) { 46 fmt.Fprintln(os.Stderr, fmt.Sprintf(format, v...)) 47 os.Exit(1) 48 } 49 50 func node(args []string) { 51 var sock mangos.Socket 52 var err error 53 var msg []byte 54 var x int 55 56 if sock, err = bus.NewSocket(); err != nil { 57 die("bus.NewSocket: %s", err) 58 } 59 if err = sock.Listen(args[2]); err != nil { 60 die("sock.Listen: %s", err.Error()) 61 } 62 63 // wait for everyone to start listening 64 time.Sleep(time.Second) 65 for x = 3; x < len(args); x++ { 66 if err = sock.Dial(args[x]); err != nil { 67 die("socket.Dial: %s", err.Error()) 68 } 69 } 70 71 // wait for everyone to join 72 time.Sleep(time.Second) 73 74 fmt.Printf("%s: SENDING '%s' ONTO BUS\n", args[1], args[1]) 75 if err = sock.Send([]byte(args[1])); err != nil { 76 die("sock.Send: %s", err.Error()) 77 } 78 for { 79 if msg, err = sock.Recv(); err != nil { 80 die("sock.Recv: %s", err.Error()) 81 } 82 fmt.Printf("%s: RECEIVED \"%s\" FROM BUS\n", args[1], 83 string(msg)) 84 85 } 86 } 87 88 func main() { 89 if len(os.Args) > 3 { 90 node(os.Args) 91 os.Exit(0) 92 } 93 fmt.Fprintf(os.Stderr, "Usage: bus <NODENAME> <URL> <URL>... \n") 94 os.Exit(1) 95 }