新手问题。因此,我尝试使用此代码在同一套接字上多次调用http服务器获取资源:
public void TryReuseSameSocket(){
var addr = Dns.GetHostAddresses("stackoverflow.com");
var socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
try
{
// i thought that i must to use this option
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1);
socket.Connect(addr, 80);
var bigbuff = new byte[10000];
for (var i = 0; i < 20; i++)
{
//now i try to call some URL many times without socket closing
var buff = Encoding.ASCII.GetBytes("GET /help/badges HTTP/1.1\r\nHost: stackoverflow.com\r\nConnection: Keep-Alive\r\n\r\n");
socket.Send(buff);
var reciveCount = 0;
var totalCount = 0;
while (true)
{
reciveCount = socket.Receive(bigbuff);
totalCount += reciveCount;
if (0 == reciveCount) break;
}
//only first call will proceed, all others will not have a result
Assert.AreNotEqual(0,totalCount);
}
}
finally
{
socket.Dispose();
}
}
但是只有第一个呼叫继续进行,所有其他呼叫都完全不返回任何数据。
如何正确使用HTTP服务器重用套接字。
您正在读取流,直到它被远程端关闭。在此之后,您将不会获得任何数据,这是有道理的。
您需要使服务器保持活动连接。这是通过设置一个保持活动的HTTP标头来完成的。您似乎正在这样做。
使用HTTP保持活动状态,服务器将设置Content-Length
标头以告诉您要读取多少字节。精确地读取那么多字节。之后,发送下一个请求。
TCP保持活动(SocketOptionName.KeepAlive
)与HTTP保持活动无关。删除该代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句