0

I am trying to write a simple client in Golang but it exits as soon as I run it,

package main

    import (
        "fmt"
        "net"
        "os"
        "bufio"
        "sync"
    )

    func main() {

        conn, err := net.Dial("tcp", "localhost:8081")
        if err != nil {
            fmt.Println(err);
            conn.Close();
        }
        fmt.Println("Got connection, type anything...new line sends and quit quits the session");
        go sendRequest(conn)
    }


    func sendRequest(conn net.Conn) {

        reader := bufio.NewReader(os.Stdin)
        var wg sync.WaitGroup
        for {
            buff := make([]byte, 2048);
            line, err := reader.ReadString('\n')
            wg.Add(1);
            if err != nil {
                fmt.Println("Error while reading string from stdin",err)
                conn.Close()
                break;
            }

            copy(buff[:], line)
            nr, err := conn.Write(buff)
            if err != nil {
                fmt.Println("Error while writing from client to connection", err);
                break;
            }
            fmt.Println(" Wrote : ", nr);
            wg.Done()
            buff = buff[:0]
        }
        wg.Wait()

    }

And when trying to run it, I get the following as output

Got connection, type anything...new line sends and quit quits the session

Process finished with exit code 0

I am expecting that the code would make stdin(terminal) open and wait for input text but it exits immediately. Should I be replacing the code with something else for reading from stdin

g0c00l.g33k
  • 2,458
  • 2
  • 31
  • 41

1 Answers1

2

A Go program exits when the main function returns.

The simple fix is to call sendRequest directly. The goroutine is not needed in this program.

func main() {

  conn, err := net.Dial("tcp", "localhost:8081")
  if err != nil {
    fmt.Println(err);
    conn.Close();
  }
  fmt.Println("Got connection, type anything...new line sends and quit quits the session");
  sendRequest(conn) // <-- go removed from this line.
}

If the goroutine is required, then use a sync.WaitGroup to make main wait for goroutines to complete:

func main() {
  conn, err := net.Dial("tcp", "localhost:8081")
  if err != nil {
    fmt.Println(err);
    conn.Close();
  }
  var wg sync.WaitGroup
  fmt.Println("Got connection, type anything...new line sends and quit quits the session");
  wg.Add(1)
  go sendRequest(&wg, conn)
  wg.Wait()
}

func sendRequest(wg *sync.WaitGroup, conn net.Conn) {
  defer wg.Done()
  // same code as before
}