Go 仅通过TCP发送第一条消息

Go 仅通过TCP发送第一条消息,go,networking,tcp,Go,Networking,Tcp,我试图实现一个通过tcp发送字符串的命令行接口,以及一个修改该字符串并返回结果的处理程序。到目前为止,我可以获取要发送的消息并对其进行修改,但不会处理以下任何消息。如何改进此代码以处理多个字符串/消息 //client package main import ( "fmt" "net" "bufio" "os" "strings" ) func main () { fmt.Println("initializing sender...") testShell()

我试图实现一个通过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()
}
//客户端
包干管
进口(
“fmt”
“净额”
“布菲奥”
“操作系统”
“字符串”
)
func main(){
fmt.Println(“初始化发送方…”)
testShell()
}
func testShell(){
reader:=bufio.NewReader(os.Stdin)
fmt.Println(“搅拌颗粒…”)
fmt.Println(“格拉特搅拌!”)
为了{
clInput,979;:=reader.ReadString('\n')
convert:=字符串。替换(clInput、“\n”、“1”)
发送消息(转换)
//监听器()
}
}
func sendMessage(输入字符串){
连接,错误:=网络拨号(“tcp”,“127.0.0.1:8080”)
如果错误!=零{
fmt.Println(错误)
}
消息:=[]字节(输入)
连接写入(消息)
康涅狄格州关闭
getter()
}
func getter(){
侦听器,err:=net.Listen(“tcp”,“127.0.0.1:9090”)
//延迟侦听器。关闭()
如果错误!=零{
fmt.Println(错误)
}
为了{
conn,err:=listener.Accept()
如果错误!=零{
fmt.Println(错误)
}
对于i:=0;i<1;i++{
传入的,uquo:=bufio.NewReader(conn.ReadString('\n'))
fmt.Println(进厂)
}
}
}
______________________________________________________________________________
//服务器
包干管
进口(
“fmt”
“净额”
//“字符串”
“布菲奥”
)
func main(){
fmt.Println(“初始化继电器…”)
接收者()
}
函数接收器(){
侦听器,err:=net.Listen(“tcp”,“127.0.0.1:8080”)
//延迟侦听器。关闭()
如果错误!=零{
fmt.Println(错误)
}
为了{
conn,err:=listener.Accept()
如果错误!=零{
fmt.Println(错误)
}
对于i:=0;i<1;i++{
传入的,uquo:=bufio.NewReader(conn.ReadString('\n'))
//如果错误!=零{
//fmt.Println(错误)
//}
fmt.Println(进厂)
传入=“已修改”+传入
发送消息(传入)
i+=1
}
}
}
func sendMessage(输入字符串){
连接,错误:=网络拨号(“tcp”,“127.0.0.1:9090”)
如果错误!=零{
fmt.Println(错误)
}
消息:=[]字节(输入)
连接写入(消息)
康涅狄格州关闭
}

您的代码只执行一次,因为两侧的侦听器从未终止。这不是代码的唯一问题

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

第二:在发送方,在发送消息后,启动一个侦听器,并进入一个接受连接的for循环。for循环从未终止,因此在处理第一条消息后,无法发送第二条消息


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

两个连接只是因为明显不了解这种通信是如何发生的,我最近才开始学习Go和编程,这其中很多都是新的!我很感谢您的指导,我将做一些研究,并尝试在相同的连接上实现它。
接收器中的循环创建和丢弃一个bufio.Reader,其中包含缓冲的任何数据。在循环外创建bufio.Reader。