Go 仅通过TCP发送第一条消息
我试图实现一个通过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()
//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。