go.nanomsg.org/mangos/v3@v3.4.3-0.20240217232803-46464076f1f5/examples/pipeline/pipeline.go (about) 1 // Copyright 2019 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 "time" 33 34 "go.nanomsg.org/mangos/v3" 35 "go.nanomsg.org/mangos/v3/protocol/pull" 36 "go.nanomsg.org/mangos/v3/protocol/push" 37 38 // register transports 39 _ "go.nanomsg.org/mangos/v3/transport/all" 40 ) 41 42 func die(format string, v ...interface{}) { 43 fmt.Fprintln(os.Stderr, fmt.Sprintf(format, v...)) 44 os.Exit(1) 45 } 46 47 func node0(url string) { 48 var sock mangos.Socket 49 var err error 50 var msg []byte 51 if sock, err = pull.NewSocket(); err != nil { 52 die("can't get new pull socket: %s", err) 53 } 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 if err != nil { 61 die("cannot receive from mangos Socket: %s", err.Error()) 62 } 63 fmt.Printf("NODE0: RECEIVED \"%s\"\n", msg) 64 65 if string(msg) == "STOP" { 66 fmt.Println("NODE0: STOPPING") 67 return 68 } 69 } 70 } 71 72 func node1(url string, msg string) { 73 var sock mangos.Socket 74 var err error 75 76 if sock, err = push.NewSocket(); err != nil { 77 die("can't get new push socket: %s", err.Error()) 78 } 79 if err = sock.Dial(url); err != nil { 80 die("can't dial on push socket: %s", err.Error()) 81 } 82 fmt.Printf("NODE1: SENDING \"%s\"\n", msg) 83 if err = sock.Send([]byte(msg)); err != nil { 84 die("can't send message on push socket: %s", err.Error()) 85 } 86 time.Sleep(time.Second / 10) 87 sock.Close() 88 } 89 90 func main() { 91 if len(os.Args) > 2 && os.Args[1] == "node0" { 92 node0(os.Args[2]) 93 os.Exit(0) 94 } 95 if len(os.Args) > 3 && os.Args[1] == "node1" { 96 node1(os.Args[2], os.Args[3]) 97 os.Exit(0) 98 } 99 fmt.Fprintf(os.Stderr, 100 "Usage: pipeline node0|node1 <URL> <ARG> ...\n") 101 os.Exit(1) 102 }