【发布时间】: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