菜鸟问题。 所以我尝试使用此代码在同一个套接字上多次调用 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 header 来完成的。您似乎正在这样做。
使用 HTTP keep alive,服务器将设置 Content-Length
header 来告诉您要读取多少字节。准确读取那么多字节。之后,发送下一个请求。
TCP 保活 (SocketOptionName.KeepAlive
) 与 HTTP 保活无关。删除该代码。
关于c# - C# (.net) 下带有 HTTP 服务器的 Keep-Alive 套接字如何发送多个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25612557/