[英]Async client handle receive?
我多次被告知異步更好,或者我應該使用異步而不是同步套接字,因此開始學習它,但是已經很困難了。
我對回調如何工作以及如何建立連接有基本的了解。
我的代碼有一些問題:
當前,該代碼將連接到服務器,發送文本,讀取響應並退出。 我該如何做才能繼續接收數據,直到服務器斷開我的連接和/或我自己結束該數據為止? 如果我需要使用while或簡單的調用將其包裝在線程上,一旦ReceiveCallback完成,則再次接收,我不太確定該怎么做。
我注意到的另一件事是,當連接時,套接字已分配給客戶端,但是代碼本身總是在重新分配客戶端套接字,與同步套接字相比,我不太了解,我們有一個主套接字,我們一直在咨詢等等
我不確定我使用的參考文獻的年齡,但是如果您能通過我所指出的示例幫助我,將不勝感激,因為它使我更容易理解。
更新:
private void SetupRecieveCallback(Socket sock)
{
new Thread(
delegate()
{
while (isReceiving)
{
_receiveQueue.Reset();
try
{
AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
sock.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock);
}
catch (Exception ex)
{
_logger.Error("Setup Recieve Callback failed! " + ex.Message);
}
_receiveQueue.WaitOne();
}
}
).Start();
/*
// The original code
try
{
AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
sock.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock);
}
catch (Exception ex)
{
_logger.Error("Setup Recieve Callback failed! " + ex.Message);
}
*/
}
只需在回調中再次調用BeginReceive()即可繼續接收。 當服務器斷開連接時,您的回調將被調用,EndReceive()引發ObjectDisposedException。 這就是您停止調用BeginReceive()的方式。
第二個問題更難解碼(只問一個)。 我猜你對這個說法感到困惑:
private static void ConnectCallback(IAsyncResult ar) {
try {
// Retrieve the socket from the state object.
Socket client = (Socket) ar.AsyncState;
// etc..
這里沒有發生重新分配套接字的情況。 該代碼僅檢索對原始套接字的引用。 這是一項有用的技術,它允許多個連接使用此回調。 該語句將ar.AsyncState值設置為套接字:
client.BeginConnect( remoteEP,
new AsyncCallback(ConnectCallback), client);
請注意如何將客戶端傳遞給AsyncCallback構造函數。 在回調中檢索到的客戶端完全相同。 可以傳遞任何對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.