Нам необходимо отправить запрос на сервер, чтобы получить некоторые данные, и мы используем сокет для асинхронного выполнения этого.
try
{
aTimerProcess.Start();
//Create socket with options: IPv4 address, a stream socket, TCP/IP Protocol
if (_socket == null)
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//Connect to Malvern
if (!boolTimeOutProcess)
{
connectDone.Reset();
IAsyncResult result = _socket.BeginConnect(_endPoint, new AsyncCallback(ConnectCallback), _socket);
connectDone.WaitOne();
if (_socket.Connected == false)
boolTimeOutProcess = true;
if (!boolTimeOutProcess)
boolSocketConnect = true;
}
//Send data
if (!boolTimeOutProcess)
{
sendDone.Reset();
vSyncTrace.LevelOneMessage("Malvern API - Sent: " + _requestString);
_socket.BeginSend(_requestBuffer, 0, _requestBuffer.Length, 0, new AsyncCallback(SendCallback), _socket);
sendDone.WaitOne();
}
//Wait for data to be returned
if (!boolTimeOutProcess)
{
receiveDone.Reset();
StateObject state = new StateObject();
state.workSocket = _socket;
_socket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
receiveDone.WaitOne();
if (receiveCallBackException != null)
throw new MalvernException("Malvern Callback Exception. Details:"
+ receiveCallBackException.Message,
receiveCallBackException);
_replyString = state.sb.ToString();
vSyncTrace.LevelOneMessage("Malvern API - Received: " + _replyString);
aTimerProcess.Stop();
}
Тогда метод BeginReceive будет
private static void ReceiveCallback(IAsyncResult ar)
{
vSyncTrace.RunLogging();
StateObject state = null;
try
{
state = (StateObject) ar.AsyncState;
Socket _socket = state.workSocket;
int bytesRead = _socket.EndReceive(ar);
if (bytesRead > 0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
vSyncTrace.LevelOneMessage("Print Buffer Tracking: " + state.sb.ToString());
_socket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}
}
catch (ObjectDisposedException ex)
{
state.workSocket = null;
// clean up of warning messages...
Console.WriteLine(ex.Message);
//
}
catch (Exception e)
{
receiveCallBackException = e;
receiveDone.Set();
}
}
Мы неНе знаю, как сервер отправляет данные.Но он отвечает в 2 пакетах или 3 пакетах в зависимости от длины данных.Когда дело доходит до 2 пакета вместе.ReceiveCallback будет введен дважды и объединит 2 строки вместе.Но когда у него будет 3 пакета, он отправит запрос, чтобы спросить остальную часть пакета.И ReceiveCallback не будет введен до тех пор, пока сокет не будет закрыт. Но закрытый сокет не сможет сделать beginReceive.Я просто хочу знать, как я должен обрабатывать ответы нескольких пакетов и объединять их вместе.Заранее спасибо.