github.com/gdamore/mangos@v1.4.0/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" 37 "nanomsg.org/go-mangos/protocol/respondent" 38 "nanomsg.org/go-mangos/protocol/surveyor" 39 "nanomsg.org/go-mangos/transport/ipc" 40 "nanomsg.org/go-mangos/transport/tcp" 41 ) 42 43 func die(format string, v ...interface{}) { 44 fmt.Fprintln(os.Stderr, fmt.Sprintf(format, v...)) 45 os.Exit(1) 46 } 47 48 func date() string { 49 return time.Now().Format(time.ANSIC) 50 } 51 52 func server(url string) { 53 var sock mangos.Socket 54 var err error 55 var msg []byte 56 if sock, err = surveyor.NewSocket(); err != nil { 57 die("can't get new surveyor socket: %s", err) 58 } 59 sock.AddTransport(ipc.NewTransport()) 60 sock.AddTransport(tcp.NewTransport()) 61 if err = sock.Listen(url); err != nil { 62 die("can't listen on surveyor socket: %s", err.Error()) 63 } 64 err = sock.SetOption(mangos.OptionSurveyTime, time.Second/2) 65 if err != nil { 66 die("SetOption(): %s", err.Error()) 67 } 68 for { 69 time.Sleep(time.Second) 70 fmt.Println("SERVER: SENDING DATE SURVEY REQUEST") 71 if err = sock.Send([]byte("DATE")); err != nil { 72 die("Failed sending survey: %s", err.Error()) 73 } 74 for { 75 if msg, err = sock.Recv(); err != nil { 76 break 77 } 78 fmt.Printf("SERVER: RECEIVED \"%s\" SURVEY RESPONSE\n", 79 string(msg)) 80 } 81 fmt.Println("SERVER: SURVEY OVER") 82 } 83 } 84 85 func client(url string, name string) { 86 var sock mangos.Socket 87 var err error 88 var msg []byte 89 90 if sock, err = respondent.NewSocket(); err != nil { 91 die("can't get new respondent socket: %s", err.Error()) 92 } 93 sock.AddTransport(ipc.NewTransport()) 94 sock.AddTransport(tcp.NewTransport()) 95 if err = sock.Dial(url); err != nil { 96 die("can't dial on respondent socket: %s", err.Error()) 97 } 98 for { 99 if msg, err = sock.Recv(); err != nil { 100 die("Cannot recv: %s", err.Error()) 101 } 102 fmt.Printf("CLIENT(%s): RECEIVED \"%s\" SURVEY REQUEST\n", 103 name, string(msg)) 104 105 d := date() 106 fmt.Printf("CLIENT(%s): SENDING DATE SURVEY RESPONSE\n", name) 107 if err = sock.Send([]byte(d)); err != nil { 108 die("Cannot send: %s", err.Error()) 109 } 110 } 111 } 112 113 func main() { 114 if len(os.Args) > 2 && os.Args[1] == "server" { 115 server(os.Args[2]) 116 os.Exit(0) 117 } 118 if len(os.Args) > 3 && os.Args[1] == "client" { 119 client(os.Args[2], os.Args[3]) 120 os.Exit(0) 121 } 122 fmt.Fprintf(os.Stderr, "Usage: survey server|client <URL> <ARG>\n") 123 os.Exit(1) 124 }