数据重新传输不正确

时间:2018-05-25 08:55:54

标签: go connection buffer slice

我需要我的程序处于连接中间并在两个方向上正确传输数据。我写了这段代码,但它无法正常工作

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))
    }
}

问题是数据已损坏, 例如。 enter image description here 左边一个是原始的,右边一个是我得到的。 最终获取文件的结尾是不可读的。 enter image description here 但是在开始时一切都还可以。 我试图改变输入切片大小。如果尺寸> 0和< 8,一切都很好,但很慢。如果我将输入大小设置得非常大,则数据损坏会变得更加糟糕。 我做错了什么?

1 个答案:

答案 0 :(得分:0)

library(shiny) library(ggplot2) shinyApp( ui = fluidPage( tabsetPanel( tabPanel( "Upload File", titlePanel("Uploading Files"), fileInput( inputId = "file1", label = "Choose CSV File", multiple = FALSE, accept = c("text/csv", "text/comma-separated-values, text/plain", ".csv") )), tabPanel( "Plot", pageWithSidebar( headerPanel("Plot your data"), sidebarPanel( selectInput("xcol", "X Variable", ""), selectInput("ycol", "Y Variable", "", selected = "") ), mainPanel(plotOutput("MyPlot")) ) ))) , server <- function(input, output, session) { # added "session" because updateSelectInput requires it data <- reactive({ req(input$file1) # require that the input is available df <- read.csv(input$file1$datapath)#, # no such inputs in your UI # header = input$header, # sep = input$sep, # quote = input$quote # ) updateSelectInput(session, inputId = "xcol", label = "X Variable", choices = names(df), selected = names(df)[sapply(df, is.numeric)] ) updateSelectInput(session, inputId = "ycol", label = "Y Variable", choices = names(df), selected = names(df)[sapply(df, is.numeric)] ) return(df) }) output$contents <- renderTable({ data() }) output$MyPlot <- renderPlot({ x <- data()[, c(input$xcol, input$ycol)] p <- ggplot(x, aes_string(input$xcol, input$ycol)) p <- p + geom_line() #+ geom_point() print(p) # plot(mydata, type = "l", # xlab = input$xcol, # ylab = input$ycol) }) # Generate a summary table of the data uploaded output$summary <- renderPrint({ y <- data() summary(y) }) } ) 中,无论handleConnection返回什么,总是写入1024个字节。

你想写这样的数据:

conn1.Read

您还应该检查您的顶级conn2.Write(input[:n]) 循环。你确定你不接受多个连接并将它们全部放在一起吗?我会在一些日志语句中撒些,以便您可以看到何时建立和关闭连接。

另一个(可能是无关紧要的)错误是,您将for视为终止条件。 In the documentation of io.Reader建议您忽略n==0。如果不检查代码,我就无法确定,但我希望n==0, err==nil永远不会返回conn.Read,因此这不太可能导致您遇到麻烦。

虽然它不会影响正确性,但您也可以将n==0, err==nil的定义提升到循环之外,以便在每次迭代时重复使用它;它可能会减少垃圾收集器的工作量。