我在Golang上编写了一个Bluemix应用程序。我向它发送了一个大块的HTTP请求,我看到我的应用程序收到通知,它只有在请求完全到达目的地时才收到此请求,而不是在标题出现后开始(在开始时没有等待正文)。 / p>
普通服务器上的相同代码工作正常,没有任何延迟,问题似乎只有在Bluemix上运行时才会出现。我做了几个实验,比如听tcp而不是http(但仍然发送http请求),并且第一次注意到只有当请求完全到达时才有一些网络。我也尝试非常缓慢地传输数据,在100ms内传输1个字节,并发送小请求,结果是一样的。
我认为在将请求重定向到App所具有的动态端口之前或者在某个其他地方有一些缓冲。任何帮助为什么会发生以及如何避免它,将非常感激。谢谢。
UPD:Go中侦听TCP的服务器代码:
func main() {
var port string
if port = os.Getenv("PORT"); len(port) == 0 { port = DEFAULT_PORT }
l, err := net.Listen("tcp", ":"+port)
if err != nil {
fmt.Println("Error listening:", err.Error())
os.Exit(1)
}
// Close the listener when the application closes.
defer l.Close()
for {
// Listen for an incoming connection.
conn, err := l.Accept()
if err != nil {
fmt.Println("Error accepting: ", err.Error())
os.Exit(1)
}
// Handle connections in a new goroutine.
go handleTCPRequest(conn)
}
}
func handleTCPRequest(conn net.Conn) {
fmt.Println("Got something!!!", conn)
// Make a buffer to hold incoming data.
buf := make([]byte, 1024)
// Read the incoming connection into the buffer.
reqLen, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err.Error(), conn)
} else {
fmt.Println("Read: ", reqLen, buf, conn)
}
// Close the connection when you're done with it.
conn.Close()
}
客户端只发送一个大的http请求或一个受限制的请求。 我希望得到印刷品" Got Something"第一个包到达后真的很快,但这不是我看到的。例如,对于限制客户端,我将把所有包装一起打印并打印出来#34;得到的东西"只有在完整包裹到货后才能使用。
Go中的限制客户端代码:
reader, writer := io.Pipe()
request, _ := http.NewRequest("PUT", URL, reader)
request.Header = http.Header{}
request.Header["Connection"]=[]string {"keep-alive"}
request.Header["X-Content-Type-Options"]=[]string {"nosniff"}
request.Header["Accept-Encoding"]=[]string{"gzip, deflate"}
request.Header["Accept"]=[]string{"*/*"}
request.Header["Transfer-Encoding"]=[]string {"chunked"}
request.TransferEncoding=[]string {"chunked"}
//puts one byte in 100ms asynchronously
go func(w *io.PipeWriter){
i:=0
for true {
i+=1
w.Write([]byte{0})
time.Sleep(100 * time.Millisecond)
fmt.Print("-")
if i > 1000 {
w.CloseWithError(io.EOF)
break
}
}
}(writer)
http.DefaultClient.Do(request)