go.nanomsg.org/mangos/v3@v3.4.3-0.20240217232803-46464076f1f5/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 "go.nanomsg.org/mangos/v3" 37 "go.nanomsg.org/mangos/v3/protocol/pub" 38 "go.nanomsg.org/mangos/v3/protocol/sub" 39 40 // register transports 41 _ "go.nanomsg.org/mangos/v3/transport/all" 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 date() string { 50 return time.Now().Format(time.ANSIC) 51 } 52 53 func server(url string) { 54 var sock mangos.Socket 55 var err error 56 if sock, err = pub.NewSocket(); err != nil { 57 die("can't get new pub socket: %s", err) 58 } 59 if err = sock.Listen(url); err != nil { 60 die("can't listen on pub socket: %s", err.Error()) 61 } 62 for { 63 // Could also use sock.RecvMsg to get header 64 d := date() 65 fmt.Printf("SERVER: PUBLISHING DATE %s\n", d) 66 if err = sock.Send([]byte(d)); err != nil { 67 die("Failed publishing: %s", err.Error()) 68 } 69 time.Sleep(time.Second) 70 } 71 } 72 73 func client(url string, name string) { 74 var sock mangos.Socket 75 var err error 76 var msg []byte 77 78 if sock, err = sub.NewSocket(); err != nil { 79 die("can't get new sub socket: %s", err.Error()) 80 } 81 if err = sock.Dial(url); err != nil { 82 die("can't dial on sub socket: %s", err.Error()) 83 } 84 // Empty byte array effectively subscribes to everything 85 err = sock.SetOption(mangos.OptionSubscribe, []byte("")) 86 if err != nil { 87 die("cannot subscribe: %s", err.Error()) 88 } 89 for { 90 if msg, err = sock.Recv(); err != nil { 91 die("Cannot recv: %s", err.Error()) 92 } 93 fmt.Printf("CLIENT(%s): RECEIVED %s\n", name, string(msg)) 94 } 95 } 96 97 func main() { 98 if len(os.Args) > 2 && os.Args[1] == "server" { 99 server(os.Args[2]) 100 os.Exit(0) 101 } 102 if len(os.Args) > 3 && os.Args[1] == "client" { 103 client(os.Args[2], os.Args[3]) 104 os.Exit(0) 105 } 106 fmt.Fprintf(os.Stderr, "Usage: pubsub server|client <URL> <ARG>\n") 107 os.Exit(1) 108 }