我需要我的程序处于连接中间并在两个方向上正确传输数据。我写了这段代码,但它无法正常工作
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,一切都很好,但很慢。如果我将输入大小设置得非常大,则数据损坏会变得更加糟糕。 我做错了什么?
答案 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
的定义提升到循环之外,以便在每次迭代时重复使用它;它可能会减少垃圾收集器的工作量。