github.com/gdamore/mangos@v1.4.0/examples/pubsub/pubsub.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 // pubsub implements a publish/subscribe example. server is a listening 16 // pub socket, and clients are dialing sub sockets. 17 // 18 // To use: 19 // 20 // $ go build . 21 // $ url=tcp://127.0.0.1:40899 22 // $ ./pubsub server $url server & server=$! && sleep 1 23 // $ ./pubsub client $url client0 & client0=$! 24 // $ ./pubsub client $url client1 & client1=$! 25 // $ ./pubsub client $url client2 & client2=$! 26 // $ sleep 5 27 // $ kill $server $client0 $client1 $client2 28 // 29 package main 30 31 import ( 32 "fmt" 33 "os" 34 "time" 35 36 "nanomsg.org/go-mangos" 37 "nanomsg.org/go-mangos/protocol/pub" 38 "nanomsg.org/go-mangos/protocol/sub" 39 "nanomsg.org/go-mangos/transport/ipc" 40 "nanomsg.org/go-mangos/transport/tcp" 41 ) 42 43 func die(format string, v ...interface{}) { 44 fmt.Fprintln(os.Stderr, fmt.Sprintf(format, v...)) 45 os.Exit(1) 46 } 47 48 func date() string { 49 return time.Now().Format(time.ANSIC) 50 } 51 52 func server(url string) { 53 var sock mangos.Socket 54 var err error 55 if sock, err = pub.NewSocket(); err != nil { 56 die("can't get new pub socket: %s", err) 57 } 58 sock.AddTransport(ipc.NewTransport()) 59 sock.AddTransport(tcp.NewTransport()) 60 if err = sock.Listen(url); err != nil { 61 die("can't listen on pub socket: %s", err.Error()) 62 } 63 for { 64 // Could also use sock.RecvMsg to get header 65 d := date() 66 fmt.Printf("SERVER: PUBLISHING DATE %s\n", d) 67 if err = sock.Send([]byte(d)); err != nil { 68 die("Failed publishing: %s", err.Error()) 69 } 70 time.Sleep(time.Second) 71 } 72 } 73 74 func client(url string, name string) { 75 var sock mangos.Socket 76 var err error 77 var msg []byte 78 79 if sock, err = sub.NewSocket(); err != nil { 80 die("can't get new sub socket: %s", err.Error()) 81 } 82 sock.AddTransport(ipc.NewTransport()) 83 sock.AddTransport(tcp.NewTransport()) 84 if err = sock.Dial(url); err != nil { 85 die("can't dial on sub socket: %s", err.Error()) 86 } 87 // Empty byte array effectively subscribes to everything 88 err = sock.SetOption(mangos.OptionSubscribe, []byte("")) 89 if err != nil { 90 die("cannot subscribe: %s", err.Error()) 91 } 92 for { 93 if msg, err = sock.Recv(); err != nil { 94 die("Cannot recv: %s", err.Error()) 95 } 96 fmt.Printf("CLIENT(%s): RECEIVED %s\n", name, string(msg)) 97 } 98 } 99 100 func main() { 101 if len(os.Args) > 2 && os.Args[1] == "server" { 102 server(os.Args[2]) 103 os.Exit(0) 104 } 105 if len(os.Args) > 3 && os.Args[1] == "client" { 106 client(os.Args[2], os.Args[3]) 107 os.Exit(0) 108 } 109 fmt.Fprintf(os.Stderr, "Usage: pubsub server|client <URL> <ARG>\n") 110 os.Exit(1) 111 }