github.com/gdamore/mangos@v1.4.0/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" 34 "nanomsg.org/go-mangos/protocol/rep" 35 "nanomsg.org/go-mangos/protocol/req" 36 "nanomsg.org/go-mangos/transport/ipc" 37 "nanomsg.org/go-mangos/transport/tcp" 38 ) 39 40 func die(format string, v ...interface{}) { 41 fmt.Fprintln(os.Stderr, fmt.Sprintf(format, v...)) 42 os.Exit(1) 43 } 44 45 func date() string { 46 return time.Now().Format(time.ANSIC) 47 } 48 49 func node0(url string) { 50 var sock mangos.Socket 51 var err error 52 var msg []byte 53 if sock, err = rep.NewSocket(); err != nil { 54 die("can't get new rep socket: %s", err) 55 } 56 sock.AddTransport(ipc.NewTransport()) 57 sock.AddTransport(tcp.NewTransport()) 58 if err = sock.Listen(url); err != nil { 59 die("can't listen on rep socket: %s", err.Error()) 60 } 61 for { 62 // Could also use sock.RecvMsg to get header 63 msg, err = sock.Recv() 64 if string(msg) == "DATE" { // no need to terminate 65 fmt.Println("NODE0: RECEIVED DATE REQUEST") 66 d := date() 67 fmt.Printf("NODE0: SENDING DATE %s\n", d) 68 err = sock.Send([]byte(d)) 69 if err != nil { 70 die("can't send reply: %s", err.Error()) 71 } 72 } 73 } 74 } 75 76 func node1(url string) { 77 var sock mangos.Socket 78 var err error 79 var msg []byte 80 81 if sock, err = req.NewSocket(); err != nil { 82 die("can't get new req socket: %s", err.Error()) 83 } 84 sock.AddTransport(ipc.NewTransport()) 85 sock.AddTransport(tcp.NewTransport()) 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 }