Golang仅通过TCP发送的第一条消息

问题描述 投票:0回答:1

我正在尝试实现一个命令行界面,该界面将通过tcp发送一个字符串,以及一个将修改该字符串并发送回结果的处理程序。到目前为止,我可以发送消息并可以对其进行修改,但是以下任何消息均未处理。我应该如何改进此代码以处理多个字符串/消息?刚开始我的Golang旅程,欢迎任何评论!

//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()
}
go networking tcp
1个回答
1
投票

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

第一:为什么要建立两个连接?接受后,您可以将响应发送回相同的连接。您需要一种机制来让另一端知道消息何时结束,\n是一种实现方法,但是您似乎正在从字符串中删除它。

第二:在发送方,发送消息后,您将启动一个侦听器,并进入一个接受连接的for循环。该for循环永远不会终止,因此在处理第一个消息之后,就无法发送第二个消息。

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

© www.soinside.com 2019 - 2024. All rights reserved.