dpziir0079 2014-10-11 11:43
浏览 18
已采纳

Golang TCP客户端出口

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('
')
            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

  • 写回答

1条回答 默认 最新

  • duanhe6464 2014-10-11 13:26
    关注

    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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂