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 在不同的执行界面调用同一个页面
  • ¥20 基于51单片机的数字频率计
  • ¥50 M3T长焦相机如何标定以及正射影像拼接问题
  • ¥15 keepalived的虚拟VIP地址 ping -s 发包测试,只能通过1472字节以下的数据包(相关搜索:静态路由)
  • ¥20 关于#stm32#的问题:STM32串口发送问题,偶校验(even),发送5A 41 FB 20.烧录程序后发现串口助手读到的是5A 41 7B A0
  • ¥15 C++map释放不掉
  • ¥15 Mabatis查询数据
  • ¥15 想知道lingo目标函数中求和公式上标是变量情况如何求解
  • ¥15 关于E22-400T22S的LORA模块的通信问题
  • ¥15 求用二阶有源低通滤波将3khz方波转为正弦波的电路