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

4
  • The problem is that go does not wait for running go routines to finish. Use a waitgroup. Commented Oct 11, 2014 at 12:11
  • Check this answer on how to wait for all goroutines to finish: stackoverflow.com/questions/18207772/… Commented Oct 11, 2014 at 12:12
  • @Kiril Tried your suggestion of using WaitGroup still having the same issue Commented Oct 11, 2014 at 13:40
  • How? Update your code. Commented Oct 11, 2014 at 13:42

1 Answer 1

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
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.