github.com/gdamore/mangos@v1.4.0/examples/pipeline/pipeline.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 // pipeline implements a one way pipe example. node0 is a listening 16 // pull socket, and node1 is a dialing push socket. 17 // 18 // To use: 19 // 20 // $ go build . 21 // $ url=tcp://127.0.0.1:40899 22 // $ ./pipeline node0 $url & node0=$! && sleep 1 23 // $ ./pipeline node1 $url "Hello, World." 24 // $ ./pipeline node1 $url "Goodbye." 25 // $ kill $node0 26 // 27 package main 28 29 import ( 30 "fmt" 31 "os" 32 33 "nanomsg.org/go-mangos" 34 "nanomsg.org/go-mangos/protocol/pull" 35 "nanomsg.org/go-mangos/protocol/push" 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 node0(url string) { 46 var sock mangos.Socket 47 var err error 48 var msg []byte 49 if sock, err = pull.NewSocket(); err != nil { 50 die("can't get new pull socket: %s", err) 51 } 52 sock.AddTransport(ipc.NewTransport()) 53 sock.AddTransport(tcp.NewTransport()) 54 if err = sock.Listen(url); err != nil { 55 die("can't listen on pull socket: %s", err.Error()) 56 } 57 for { 58 // Could also use sock.RecvMsg to get header 59 msg, err = sock.Recv() 60 fmt.Printf("NODE0: RECEIVED \"%s\"\n", msg) 61 } 62 } 63 64 func node1(url string, msg string) { 65 var sock mangos.Socket 66 var err error 67 68 if sock, err = push.NewSocket(); err != nil { 69 die("can't get new push socket: %s", err.Error()) 70 } 71 sock.AddTransport(ipc.NewTransport()) 72 sock.AddTransport(tcp.NewTransport()) 73 if err = sock.Dial(url); err != nil { 74 die("can't dial on push socket: %s", err.Error()) 75 } 76 fmt.Printf("NODE1: SENDING \"%s\"\n", msg) 77 if err = sock.Send([]byte(msg)); err != nil { 78 die("can't send message on push socket: %s", err.Error()) 79 } 80 sock.Close() 81 } 82 83 func main() { 84 if len(os.Args) > 2 && os.Args[1] == "node0" { 85 node0(os.Args[2]) 86 os.Exit(0) 87 } 88 if len(os.Args) > 3 && os.Args[1] == "node1" { 89 node1(os.Args[2], os.Args[3]) 90 os.Exit(0) 91 } 92 fmt.Fprintf(os.Stderr, 93 "Usage: pipeline node0|node1 <URL> <ARG> ...\n") 94 os.Exit(1) 95 }