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  }