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  }