【问题标题】:Only first message sent over TCP仅通过 TCP 发送的第一条消息
【发布时间】:2020-04-23 02:59:15
【问题描述】:

我正在尝试实现一个命令行界面,它将通过 tcp 发送一个字符串,以及一个将修改该字符串并发回结果的处理程序。到目前为止,我可以获取要发送的消息并且可以对其进行修改,但是没有处理任何后续消息。我应该如何改进此代码以处理多个字符串/消息?

//client
package main

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


func main () {
  fmt.Println("initializing sender...")
  testShell()

}

func testShell() {
  reader := bufio.NewReader(os.Stdin)
  fmt.Println("Stirring the GRAT...")
  fmt.Println("GRAT Stirred!")
  for {
    clInput, _ := reader.ReadString('\n')
    convert := strings.Replace(clInput, "\n", "", -1)
    sendMessage(convert)
    //listener()
  }
}

func sendMessage (input string) {
  conn, err := net.Dial("tcp", "127.0.0.1:8080")
  if err != nil {
    fmt.Println(err)
  }

  message := []byte(input)
  conn.Write(message)
  conn.Close()
  getter()

}

func getter() {
  listener, err := net.Listen("tcp", "127.0.0.1:9090")
  //defer listener.Close()

  if err != nil {
    fmt.Println(err)
  }

  for {
    conn, err := listener.Accept()
    if err != nil {
      fmt.Println(err)
    }

    for i := 0; i < 1; i++ {
      incoming, _ := bufio.NewReader(conn).ReadString('\n')
      fmt.Println(incoming)
    }
  }
}

______________________________________________________________________________

//server
package main

import (
  "fmt"
  "net"
  //"strings"
  "bufio"
)

func main() {
  fmt.Println("initializing relay...")
  receiver()

}

func receiver() {
  listener, err := net.Listen("tcp", "127.0.0.1:8080")
  //defer listener.Close()

  if err != nil {
    fmt.Println(err)
  }
  for {
    conn, err := listener.Accept()
    if err != nil {
      fmt.Println(err)
    }

    for i := 0; i < 1; i++ {
    incoming, _ := bufio.NewReader(conn).ReadString('\n')
    //if err != nil {
      //fmt.Println(err)
    //}
    fmt.Println(incoming)
    incoming = "modified " + incoming
    sendMessage(incoming)
    i += 1
  }
}
}

func sendMessage(input string) {
  conn, err := net.Dial("tcp", "127.0.0.1:9090")
  if err != nil {
    fmt.Println(err)
  }

  message := []byte(input)
  conn.Write(message)
  conn.Close()
}

【问题讨论】:

  • receiver 中的循环创建并丢弃一个 bufio.Reader,其中缓冲了任何数据。在循环外创建 bufio.Reader。

标签: go networking tcp


【解决方案1】:

您的代码只执行一次,因为双方的侦听器都不会终止。这不是代码的唯一问题。

第一:为什么有两个连接?接受后,您可以将响应发送回同一连接。您需要有一种机制让对方知道消息何时结束,\n 是一种这样做的方式,但是您似乎正在从字符串中删除它。

第二:在发送方,在您发送消息后,您启动一​​个监听器,并进入一个接受连接的 for 循环。那个 for 循环永远不会终止,所以在处理完第一条消息之后,就没有办法发送第二条消息了。

我的建议是首先将您的程序更改为使用一个 tcp 连接,两端都向该连接写入数据并从中读取数据。然后你可以多次读取输入、发送数据、处理和接收,直到一侧关闭连接。

【讨论】:

  • 两个连接只是来自对这种通信如何发生的明显缺乏理解,我最近刚开始学习 Go 和一般编程,所以很多都是新的!感谢您的指导,我会做一些研究并尝试在同一连接上实施它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2019-01-06
  • 2016-08-21
相关资源
最近更新 更多