我有这样一种情况,我正在向机器发送正确的请求字节。当通过另一个应用程序运行时,我可以看到响应已发送,机器发送的第一个响应不包含任何字节(仅包含头数据),因此在我的代码中,我检查如果"tcpStream.DataAvailable“明显返回"false”,则程序退出。
问题是第一个响应不是在后面的几个响应中数据is...it所在的位置。
那么基本上我该如何忽略第一个响应并等待2+响应中的数据呢?
这是我正在使用的代码片段:
byte[] myReadBuffer = new byte[1024];
StringBuilder myCompleteMessage = new StringBuilder();
int numberOfBytesRead = 0;
// Incoming message may be larger than the buffer size.
do
{
numberOfBytesRead = tcpStream.Read(myReadBuffer, 0, myReadBuffer.Length);
myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
}
while (tcpStream.DataAvailable);更新:
我更改了代码以异步处理通信。这是新的代码(仍然不能工作):
public class GetCellList
{
private ManualResetEvent connectDone = new ManualResetEvent(false);
private ManualResetEvent sendDone = new ManualResetEvent(false);
private ManualResetEvent receiveDone = new ManualResetEvent(false);
private string _serverIP;
private int _serverPort;
private StateObject _stateObject = new StateObject();
private static String response = String.Empty;
public GetCellList(string serverIP, int serverPort)
{
_serverIP = serverIP;
_serverPort = serverPort;
_stateObject.workSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(_serverIP), _serverPort);
StartClient(remoteEP);
}
private void StartClient(IPEndPoint remoteEndpoint)
{
try
{
_stateObject.workSocket.BeginConnect(remoteEndpoint,
new AsyncCallback(ConnectCallback), _stateObject.workSocket);
connectDone.WaitOne();
Send(_stateObject.workSocket, GetData());
sendDone.WaitOne();
Receive(_stateObject.workSocket);
receiveDone.WaitOne();
Console.WriteLine("Response received : {0}", response);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
private byte[] GetData()
{
var requestString = "00 25 B4 CE 42 80 D4 81 D7 DD 44 37 08 00 45 00 00 43 06 27 00 00 80 06 00 00 0A D4 E2 4E 0A 68 3D CC 2E 12 04 01 4B 7A C8 7B FE 5C 2E F5 50 18 00 FF 35 8C 00 00 43 50 43 52 00 01 19 00 00 00 1B 00 00 00 02 00 00 00 00 00 00 00 1D 00 00 00 00".Replace(" ", "");
return Convertors.ConvertToByteArray(requestString);
}
private void ConnectCallback(IAsyncResult ar)
{
try
{
Socket client = (Socket)ar.AsyncState;
client.EndConnect(ar);
Console.WriteLine("Socket connected to {0}",
client.RemoteEndPoint.ToString());
connectDone.Set();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
private void Receive(Socket client)
{
try
{
StateObject state = new StateObject();
state.workSocket = client;
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.workSocket;
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
}
else
{
if (state.sb.Length > 1)
{
response = state.sb.ToString();
}
receiveDone.Set();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
private void Send(Socket client, byte[] byteData)
{
client.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), client);
}
private void SendCallback(IAsyncResult ar)
{
try
{
Socket client = (Socket)ar.AsyncState;
int bytesSent = client.EndSend(ar);
Console.WriteLine("Sent {0} bytes to server.", bytesSent);
sendDone.Set();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
}}
发布于 2017-11-15 20:36:54
这里的问题恰恰是您正在检查tcpStream.DataAvailable。这是本地缓冲的数据量,它是零告诉你nothing关于将要到达的东西。更典型的循环是:
while((numberOfBytesRead = tcpStream.Read(myReadBuffer, 0, myReadBuffer.Length)) > 0)
{ ... }DataAvailable的唯一实际用途是决定是同步读取还是异步读取-如果缓冲区中没有任何内容,则可以选择异步读取。
请注意,一般来说,您还应该非常小心地处理“帧”,并知道缓冲区中的内容是否可以被合理地处理;由于您使用的是ASCII码,所以在您的情况下几乎可以避免这种情况,但如果这是类似UTF8的代码,则需要更加小心,因为单个字符可能跨越两个(理论上是更多) Read调用-这意味着您可能在缓冲区的末尾获得3字节字符的一个字节,而在下一次Read调用中在缓冲区的开始处获得相同字符的另外两个字节。
https://stackoverflow.com/questions/47307565
复制相似问题