我让网络服务器通过异步套接字接收数据:
var e = new SocketAsyncEventArgs();
e.Completed += new EventHandler<SocketAsyncEventArgs>(e_Completed);
while (true)
{ allDone.Reset();
mySocket.AcceptAsync(e);
allDone.WaitOne();
}
另一种方法:
public void e_Completed(object sender, SocketAsyncEventArgs e)
{
var socket = (Socket)sender;
ThreadPool.QueueUserWorkItem(handleTcpRequest, e.AcceptSocket);
e.AcceptSocket = null;
socket.AcceptAsync(e);
}
这是handleTcpRequest方法。在这一部分中,我从套接字接收数据并执行操作:
public void handleTcpRequest(object state)
{
string sBuffer = "";
string BufferTotal = "";
byte[] secureMessage;
Byte[] bReceive = new Byte[1024];
var mySocket = (Socket)state;
do
{
try
{
firstBufferRead = mySocket.Receive(bReceive, bReceive.Length, 0);
}
catch (Exception ex)
{
Console.WriteLine("Error Occurred (:))) " + ex.Message);
}
sBuffer += Encoding.GetEncoding(1252).GetString(bReceive, 0, firstBufferRead);
BufferTotal += Encoding.UTF8.GetString(bReceive, 0, firstBufferRead);
} while (mySocket.Available != 0);
.
.
.
.
mySocket.Close();
}
怎么了?有时,连接会重置并关闭。当距离较远或发布数据不是多部分时,会发生这种情况。但是很少发生。形式不多的内容。我应该在何时何地关闭插座?当我在handleTcpRequest方法中使用套接字本地时。不对吗 我找不到问题的根源
知道您已收到HTTP请求中所有内容的唯一方法是了解HTTP请求。要了解HTTP请求,您必须选择:
您的代码无法处理多部分数据的原因可能是因为另一方一次发送了一个部分,这意味着您的代码设法mySocket.Available != 0
在发送其余部分之前执行了一个操作。
如果要使用后者,则必须阅读HTTP标头(格式为headerName: headervalue
,请注意,还必须考虑空白规则)。搜索一个名为的标头content-length
,将其值解析为整数。然后在一行中等待两个换行(\r\n\r\n
)。最后开始计数字节,直到您收到content-length
标头中指定的字节数为止。
哦..还有更多的事情..向Transfer-Encoding: Chunked
没有被使用的上帝祈祷。
我的建议是您直接放弃使用套接字,因为您似乎不了解套接字如何工作或如何对其进行研究。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句