不正确的数据重新传输 我需要我的程序在连接的中间,并在两个方向上正确地传送数据。我写了这段代码,但它不能正常工作 package main import ( "fmt" "net" ) func main() { listener, err := net.Listen("tcp", ":8120") if err != nil { fmt.Println(err) return } defer listener.Close() fmt.Println("Server is listening...") for { var conn1, conn2 net.Conn var err error conn1, err = listener.Accept() if err != nil { fmt.Println(err) conn1.Close() continue } conn2, err = net.Dial("tcp", "185.151.245.51:80") if err != nil { fmt.Println(err) conn2.Close() continue } go handleConnection(conn1, conn2) go handleConnection(conn2, conn1) } } func handleConnection(conn1, conn2 net.Conn) { defer conn1.Close() for { input := make([]byte, 1024) n, err := conn1.Read(input) if n == 0 || err != nil { break } conn2.Write([]byte(input)) } }
问题是数据被破坏了, 例如 左边的是原创的,右边的是我得到的。 无法读取最终获取的文件的结尾。 但一开始一切都很好。 我试图改变输入片的大小。如果大小>0且小于8,则一切正常,但速度较慢。如果我将输入大小设置得非常大,数据的损坏会变得更加可怕。不正确的数据重新传输 我需要我的程序在连接的中间,并在两个方向上正确地传送数据。我写了这段代码,但它不能正常工作 package main import ( "fmt" "net" ) func main() { listener, err := net.Listen("tcp", ":8120") if err != nil { fmt.Println(err) return } defer listener.Close() fmt.Println("Server is listening...") for { var conn1, conn2 net.Conn var err error conn1, err = listener.Accept() if err != nil { fmt.Println(err) conn1.Close() continue } conn2, err = net.Dial("tcp", "185.151.245.51:80") if err != nil { fmt.Println(err) conn2.Close() continue } go handleConnection(conn1, conn2) go handleConnection(conn2, conn1) } } func handleConnection(conn1, conn2 net.Conn) { defer conn1.Close() for { input := make([]byte, 1024) n, err := conn1.Read(input) if n == 0 || err != nil { break } conn2.Write([]byte(input)) } },go,connection,buffer,slice,Go,Connection,Buffer,Slice,问题是数据被破坏了, 例如 左边的是原创的,右边的是我得到的。 无法读取最终获取的文件的结尾。 但一开始一切都很好。 我试图改变输入片的大小。如果大小>0且小于8,则一切正常,但速度较慢。如果我将输入大小设置得非常大,数据的损坏会变得更加可怕。 我做错了什么?在handleConnection中,您总是写入1024字节,无论conn1如何。Read返回 您希望像这样写入数据: conn2.Write(input[:n]) 您还应该检查顶级的循环。你确定你没有接受多个连接并将它们全部弄脏吗?我会
我做错了什么?在
handleConnection
中,您总是写入1024字节,无论conn1如何。Read
返回
您希望像这样写入数据:
conn2.Write(input[:n])
您还应该检查顶级的循环。你确定你没有接受多个连接并将它们全部弄脏吗?我会加入一些日志语句,以便您可以看到连接何时建立和关闭
另一个(可能是无关紧要的)错误是,您将n==0
视为终止条件。建议您忽略n==0,err==nil
。如果不检查代码,我无法确定,但我希望conn.Read
永远不会返回n==0,err==nil
,因此这不太可能给您带来麻烦
虽然它不会影响正确性,但您也可以将输入的定义从循环中提出来,以便在每次迭代中重用它;这可能会减少垃圾收集器必须完成的工作量