当前位置: 首页 > 编程语言 > C#

如何在C#(.net)下使用HTTP服务器保活套接字发送多个查询?分享

时间:2023-04-10 22:27:38 C#

C#(.net)下如何使用HTTPserverkeep-alivesockets发送多个查询?诺布的问题。所以我尝试使用这段代码在同一个套接字上多次调用http服务器资源:publicvoidTryReuseSameSocket(){varaddr=Dns.GetHostAddresses("stackoverflow.com");varsocket=newSocket(SocketType.Stream,ProtocolType.Tcp);try{//我认为我必须使用这个选项socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.KeepAlive,1);套接字连接(地址,80);varbigbuff=newbyte[10000];for(vari=0;i<20;i++){//现在我尝试在没有关闭套接字的情况下多次调用一些URLvarbuff=Encoding.ASCII.GetBytes("GET/help/badgesHTTP/1.1rnHost:stackoverflow.comrnConnection:Keep-Alivernrn");套接字发送(浅黄色);varreciveCount=0;变种总数=0;while(true){reciveCount=socket.Receive(bigbuff);totalCount+=reciveCount;如果(0==reciveCount)中断;}//只有第一个调用会继续,所有其他调用都不会有结果Assert.AreNotEqual(0,totalCount);}}最后{socket.Dispose();但只有第一个调用会继续进行,所有其他调用都不返回任何数据。如何正确重用HTTP服务器的套接字。您正在读取流,直到它被远程端关闭。之后您将无法获取任何数据,这是有道理的。您需要保持服务器连接处于活动状态。这是通过设置keep-aliveHTTP标头来完成的。你似乎正在这样做。在HTTPkeep-alive中,服务器将设置Content-Length标头来告诉您要读取多少字节。准确读取那么多字节。之后,发送下一个请求。TCP保持SocketOptionName.KeepAlive(SocketOptionName.KeepAlive)与HTTP保持SocketOptionName.KeepAlive无关。删除该代码。另外,我的另一个回答有误,您没有指示服务器保持连接有效。正确的标头值是keep-alive。这就是服务器关闭连接的原因。谢谢。现在我找到了解决方案:1)不要忘记检查socket.Available来决定是流读取的结尾,检查stream.Read(...)==0或Recive(...)==0不是真实的东西2)不要相信Internet有些服务器返回Keep-Alive但不是真的-连接已打开,但所有子请求都失败3)如果读取逻辑看起来有问题的片段正在工作while(socket.Available!=0){socket.Receive(bigbuff);}4)它不是100%总是好的(你需要检查一些其他套接字的东西来控制读取),但它在真正的Keep-Alive支持的网站上运行良好。以上是C#学习教程:HowtosendmultiplequeriesusingHTTPserverkeep-alivesocketsunderC#(.net)?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: