github.com/gdamore/mangos@v1.4.0/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" 39 "nanomsg.org/go-mangos/protocol/bus" 40 "nanomsg.org/go-mangos/transport/ipc" 41 "nanomsg.org/go-mangos/transport/tcp" 42 ) 43 44 func die(format string, v ...interface{}) { 45 fmt.Fprintln(os.Stderr, fmt.Sprintf(format, v...)) 46 os.Exit(1) 47 } 48 49 func node(args []string) { 50 var sock mangos.Socket 51 var err error 52 var msg []byte 53 var x int 54 55 if sock, err = bus.NewSocket(); err != nil { 56 die("bus.NewSocket: %s", err) 57 } 58 sock.AddTransport(ipc.NewTransport()) 59 sock.AddTransport(tcp.NewTransport()) 60 if err = sock.Listen(args[2]); err != nil { 61 die("sock.Listen: %s", err.Error()) 62 } 63 64 // wait for everyone to start listening 65 time.Sleep(time.Second) 66 for x = 3; x < len(args); x++ { 67 if err = sock.Dial(args[x]); err != nil { 68 die("socket.Dial: %s", err.Error()) 69 } 70 } 71 72 // wait for everyone to join 73 time.Sleep(time.Second) 74 75 fmt.Printf("%s: SENDING '%s' ONTO BUS\n", args[1], args[1]) 76 if err = sock.Send([]byte(args[1])); err != nil { 77 die("sock.Send: %s", err.Error()) 78 } 79 for { 80 if msg, err = sock.Recv(); err != nil { 81 die("sock.Recv: %s", err.Error()) 82 } 83 fmt.Printf("%s: RECEIVED \"%s\" FROM BUS\n", args[1], 84 string(msg)) 85 86 } 87 } 88 89 func main() { 90 if len(os.Args) > 3 { 91 node(os.Args) 92 os.Exit(0) 93 } 94 fmt.Fprintf(os.Stderr, "Usage: bus <NODENAME> <URL> <URL>... \n") 95 os.Exit(1) 96 }