我正在尝试实现一个命令行界面,该界面将通过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()
}
答案 0 :(得分:1)
您的代码仅执行一次,因为双方的侦听器都不会终止。这不是代码的唯一问题。
第一:为什么要建立两个连接?接受后,您可以将响应发送回相同的连接。您需要一种机制来让另一端知道消息何时结束,\n
是一种做到这一点的方法,但是您似乎正在从字符串中删除它。
第二个:在发送方,发送消息后,启动一个侦听器,并进入一个接受连接的for循环。该for循环永远不会终止,因此在处理第一个消息之后,就无法发送第二个消息。
我的建议是,首先将程序更改为使用一个tcp连接,两端都将向该tcp连接进行写入,并且两端都将从中进行读取。然后,您可以读取输入,发送数据,进行处理并接收多次,直到一侧关闭连接为止。