nanomsg.org/go/mangos/v2@v2.0.9-0.20200203084354-8a092611e461/examples/survey/survey.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 // survey implements a survey example. server is a surveyor listening 16 // socket, and clients are dialing respondent sockets. 17 // 18 // To use: 19 // 20 // $ go build . 21 // $ url=tcp://127.0.0.1:40899 22 // $ ./survey server $url server & server=$! 23 // $ ./survey client $url client0 & client0=$! 24 // $ ./survey client $url client1 & client1=$! 25 // $ ./survey 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/v2" 37 "nanomsg.org/go/mangos/v2/protocol/respondent" 38 "nanomsg.org/go/mangos/v2/protocol/surveyor" 39 40 // register transports 41 _ "nanomsg.org/go/mangos/v2/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 var msg []byte 57 if sock, err = surveyor.NewSocket(); err != nil { 58 die("can't get new surveyor socket: %s", err) 59 } 60 if err = sock.Listen(url); err != nil { 61 die("can't listen on surveyor socket: %s", err.Error()) 62 } 63 err = sock.SetOption(mangos.OptionSurveyTime, time.Second/2) 64 if err != nil { 65 die("SetOption(): %s", err.Error()) 66 } 67 for { 68 time.Sleep(time.Second) 69 fmt.Println("SERVER: SENDING DATE SURVEY REQUEST") 70 if err = sock.Send([]byte("DATE")); err != nil { 71 die("Failed sending survey: %s", err.Error()) 72 } 73 for { 74 if msg, err = sock.Recv(); err != nil { 75 break 76 } 77 fmt.Printf("SERVER: RECEIVED \"%s\" SURVEY RESPONSE\n", 78 string(msg)) 79 } 80 fmt.Println("SERVER: SURVEY OVER") 81 } 82 } 83 84 func client(url string, name string) { 85 var sock mangos.Socket 86 var err error 87 var msg []byte 88 89 if sock, err = respondent.NewSocket(); err != nil { 90 die("can't get new respondent socket: %s", err.Error()) 91 } 92 if err = sock.Dial(url); err != nil { 93 die("can't dial on respondent socket: %s", err.Error()) 94 } 95 for { 96 if msg, err = sock.Recv(); err != nil { 97 die("Cannot recv: %s", err.Error()) 98 } 99 fmt.Printf("CLIENT(%s): RECEIVED \"%s\" SURVEY REQUEST\n", 100 name, string(msg)) 101 102 d := date() 103 fmt.Printf("CLIENT(%s): SENDING DATE SURVEY RESPONSE\n", name) 104 if err = sock.Send([]byte(d)); err != nil { 105 die("Cannot send: %s", err.Error()) 106 } 107 } 108 } 109 110 func main() { 111 if len(os.Args) > 2 && os.Args[1] == "server" { 112 server(os.Args[2]) 113 os.Exit(0) 114 } 115 if len(os.Args) > 3 && os.Args[1] == "client" { 116 client(os.Args[2], os.Args[3]) 117 os.Exit(0) 118 } 119 fmt.Fprintf(os.Stderr, "Usage: survey server|client <URL> <ARG>\n") 120 os.Exit(1) 121 }