nanomsg.org/go/mangos/v2@v2.0.9-0.20200203084354-8a092611e461/examples/reqrep/reqrep.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 // reqprep implements a request/reply example. node0 is a listening 16 // rep socket, and node1 is a dialing req socket. 17 // 18 // To use: 19 // 20 // $ go build . 21 // $ url=tcp://127.0.0.1:40899 22 // $ ./reqrep node0 $url & node0=$! && sleep 1 23 // $ ./reqrep node1 $url 24 // $ kill $node0 25 // 26 package main 27 28 import ( 29 "fmt" 30 "os" 31 "time" 32 33 "nanomsg.org/go/mangos/v2" 34 "nanomsg.org/go/mangos/v2/protocol/rep" 35 "nanomsg.org/go/mangos/v2/protocol/req" 36 37 // register transports 38 _ "nanomsg.org/go/mangos/v2/transport/all" 39 ) 40 41 func die(format string, v ...interface{}) { 42 fmt.Fprintln(os.Stderr, fmt.Sprintf(format, v...)) 43 os.Exit(1) 44 } 45 46 func date() string { 47 return time.Now().Format(time.ANSIC) 48 } 49 50 func node0(url string) { 51 var sock mangos.Socket 52 var err error 53 var msg []byte 54 if sock, err = rep.NewSocket(); err != nil { 55 die("can't get new rep socket: %s", err) 56 } 57 if err = sock.Listen(url); err != nil { 58 die("can't listen on rep socket: %s", err.Error()) 59 } 60 for { 61 // Could also use sock.RecvMsg to get header 62 msg, err = sock.Recv() 63 if string(msg) == "DATE" { // no need to terminate 64 fmt.Println("NODE0: RECEIVED DATE REQUEST") 65 d := date() 66 fmt.Printf("NODE0: SENDING DATE %s\n", d) 67 err = sock.Send([]byte(d)) 68 if err != nil { 69 die("can't send reply: %s", err.Error()) 70 } 71 } 72 } 73 } 74 75 func node1(url string) { 76 var sock mangos.Socket 77 var err error 78 var msg []byte 79 80 if sock, err = req.NewSocket(); err != nil { 81 die("can't get new req socket: %s", err.Error()) 82 } 83 if err = sock.Dial(url); err != nil { 84 die("can't dial on req socket: %s", err.Error()) 85 } 86 fmt.Printf("NODE1: SENDING DATE REQUEST %s\n", "DATE") 87 if err = sock.Send([]byte("DATE")); err != nil { 88 die("can't send message on push socket: %s", err.Error()) 89 } 90 if msg, err = sock.Recv(); err != nil { 91 die("can't receive date: %s", err.Error()) 92 } 93 fmt.Printf("NODE1: RECEIVED DATE %s\n", string(msg)) 94 sock.Close() 95 } 96 97 func main() { 98 if len(os.Args) > 2 && os.Args[1] == "node0" { 99 node0(os.Args[2]) 100 os.Exit(0) 101 } 102 if len(os.Args) > 2 && os.Args[1] == "node1" { 103 node1(os.Args[2]) 104 os.Exit(0) 105 } 106 fmt.Fprintf(os.Stderr, "Usage: reqrep node0|node1 <URL>\n") 107 os.Exit(1) 108 }