为了账号安全,请及时绑定邮箱和手机立即绑定

Golang TCP 客户端退出

Golang TCP 客户端退出

Go
绝地无双 2021-08-23 15:50:59
我正在尝试在 Golang 中编写一个简单的客户端,但是我一运行它就退出了,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()    }当尝试运行它时,我得到以下输出Got connection, type anything...new line sends and quit quits the sessionProcess finished with exit code 0我期望代码会使 stdin(terminal) 打开并等待输入文本,但它会立即退出。我是否应该用其他东西替换代码以从标准输入读取
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

当main函数返回时,Go 程序退出。


简单的解决方法是sendRequest直接调用。这个程序不需要goroutine。


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.

}

如果需要够程,然后用sync.WaitGroup使main等待够程来完成:


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

}


查看完整回答
反对 回复 2021-08-23
  • 1 回答
  • 0 关注
  • 236 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信