【发布时间】:2014-01-24 11:59:28
【问题描述】:
我正在使用以下代码执行 tcp 套接字连接并将字符串发送到 IP。但有时在响应中,我没有收到整个文件
Socket m_socClient;
IPSelected ="1.1.2.3"
Port = "80"
string query ="My Query"
m_socClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
System.Net.IPAddress remoteIPAddress = System.Net.IPAddress.Parse(IPSelected);
System.Net.IPEndPoint remoteEndPoint = new System.Net.IPEndPoint(remoteIPAddress, Port);
m_socClient.Connect(remoteEndPoint);
try
{
if (m_socClient.Connected)
{
var reQuestToSend = "";
reQuestToSend = string.Format("POST /TMHP/Request HTTP/1.1\r\nHost:{0}\r\nContent-Length:{1}\r\n\r\n{2}", "edi-webtest.tmhp.com", Query270.Length, Query270);
byte[] bytesToSend = Encoding.ASCII.GetBytes(reQuestToSend);
byteCount = m_socClient.Send(bytesToSend, SocketFlags.None);
byte[] bytesReceived = new byte[3000];
byteCount = m_socClient.Receive(bytesReceived, SocketFlags.None);
Response271 = Encoding.ASCII.GetString(bytesReceived);
}
}
catch (Exception ex)
{
EVCommon.Log(ex.Message);
}
finally
{
m_socClient.Disconnect(false);
m_socClient.Close(5000);
}
我认为问题出在 byte[] bytesReceived = new byte[3000]; 有没有办法不对这个数字 3000 进行硬编码。它大部分时间都有效,但对于较长的字符串,它只能得到一半。 我希望它处理可变大小的消息,而不是将字节大小设置为 30000 谢谢
【问题讨论】:
-
读取socket的代码在哪里?您必须继续阅读,直到服务器关闭连接,或者您收到最后一个块,或者读取 Content-length 标头指示的字节,或者......使用 WebClient 或 HttpClient 之类的 HTTP 库。跨度>
-
我无权访问服务器代码。我确信他们会收到整个字符串。因为在他们收到一个完整的字符串并最终通过验证之前,他们不会用另一个字符串响应。问题不在于阅读。这是接收响应的问题
-
就像@CodeCaster 所说 - 从套接字读取到 bytesReceived 数组的代码在哪里?
-
@MartinJames:哎呀对不起..我不小心删除了那条线。编辑后的帖子
-
你为什么不使用 URL 和 URLConnection 呢?他们解决了所有这些问题,以及许多其他问题。