go.nanomsg.org/mangos/v3@v3.4.3-0.20240217232803-46464076f1f5/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 "go.nanomsg.org/mangos/v3" 34 "go.nanomsg.org/mangos/v3/protocol/rep" 35 "go.nanomsg.org/mangos/v3/protocol/req" 36 37 // register transports 38 _ "go.nanomsg.org/mangos/v3/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 err != nil { 64 die("cannot receive on rep socket: %s", err.Error()) 65 } 66 if string(msg) == "DATE" { // no need to terminate 67 fmt.Println("NODE0: RECEIVED DATE REQUEST") 68 d := date() 69 fmt.Printf("NODE0: SENDING DATE %s\n", d) 70 err = sock.Send([]byte(d)) 71 if err != nil { 72 die("can't send reply: %s", err.Error()) 73 } 74 } 75 } 76 } 77 78 func node1(url string) { 79 var sock mangos.Socket 80 var err error 81 var msg []byte 82 83 if sock, err = req.NewSocket(); err != nil { 84 die("can't get new req socket: %s", err.Error()) 85 } 86 if err = sock.Dial(url); err != nil { 87 die("can't dial on req socket: %s", err.Error()) 88 } 89 fmt.Printf("NODE1: SENDING DATE REQUEST %s\n", "DATE") 90 if err = sock.Send([]byte("DATE")); err != nil { 91 die("can't send message on push socket: %s", err.Error()) 92 } 93 if msg, err = sock.Recv(); err != nil { 94 die("can't receive date: %s", err.Error()) 95 } 96 fmt.Printf("NODE1: RECEIVED DATE %s\n", string(msg)) 97 sock.Close() 98 } 99 100 func main() { 101 if len(os.Args) > 2 && os.Args[1] == "node0" { 102 node0(os.Args[2]) 103 os.Exit(0) 104 } 105 if len(os.Args) > 2 && os.Args[1] == "node1" { 106 node1(os.Args[2]) 107 os.Exit(0) 108 } 109 fmt.Fprintf(os.Stderr, "Usage: reqrep node0|node1 <URL>\n") 110 os.Exit(1) 111 }