您好所有我有這個問題,我堅持了下來,所以任何幫助,將不勝感激套接字隊列問題
我必須建立一個socket聊天(客戶端服務器)模塊,我已經做了近80%工作,但現在我卡住了,情景是我有一個服務器應用程序和客戶端連接到它現在如果說4個客戶端連接到服務器,他們每個人都可以互相溝通,一個客戶端將發送消息,服務器將收到該消息並將傳遞它,這是工作得很好,但當2個或更多的客戶端發送消息到第三個客戶端在同一時間,我不能得到一個消息和客戶端斷開連接我知道我必須建立一個隊列結構,但我在這裏沒有成功 這裏是我的代碼結構
StartReceive(SocketAsyncEventArgs) ->
所有我把這種方法首先開始監聽傳入的消息
,當我得到一個消息,我檢查它是否完成同步或異步
,並在此之後有一個IO每完成一個接收操作就完成一個完成的監聽器,並且在這個完成的方法中,我會調用processReceive方法來處理接收到的塊 因此最後我的代碼結構是這樣的
StartReceive-> IO Completed -> ProcessReceive
我設計的結構,使每一個客戶都會有一個接收SOCKETASYNCEVENTAGRS 對象,並在服務器端發送SOCKETASYNCEVENTAGRS而我呢維持這個
所以每個客戶端接收,並通過自身的SOCKETASYNCEVENTAGRS對象發送數據池
我想要一個場景,如果兩個或多個客戶端發送消息到第三個客戶端比第三個客戶端不應該在同一時間接收所有消息,而應該有一個隊列結構,它應該一次接收一條消息用於發送操作
這裏是我的一些代碼
private void StartReceive(SocketAsyncEventArgs receiveSendEventArgs)
{
DataHoldingUserToken receiveSendToken = (DataHoldingUserToken)receiveSendEventArgs.UserToken;
receiveSendEventArgs.SetBuffer(receiveSendToken.bufferOffsetReceive, this.socketListenerSettings.BufferSize);
bool willRaiseEvent = receiveSendEventArgs.AcceptSocket.ReceiveAsync(receiveSendEventArgs);
if (!willRaiseEvent)
{
ProcessReceive(receiveSendEventArgs);
}
}
這是IO完成
void IO_Completed(object sender, SocketAsyncEventArgs e)
{
DataHoldingUserToken receiveSendToken = (DataHoldingUserToken)e.UserToken;
switch (e.LastOperation)
{
case SocketAsyncOperation.Receive:
ProcessReceive(e);
break;
default:
}
}
,這是我StartReceive與隊列實現,但它不工作
Queue rec = new Queue();
bool IsExecuted = true;
private void StartReceive(SocketAsyncEventArgs receiveSendEventArgs)
{
if (IsExecuted)
{
DataHoldingUserToken receiveSendToken = (DataHoldingUserToken)receiveSendEventArgs.UserToken;
rec.Enqueue(receiveSendToken);
}
try
{
receiveSendEventArgs.SetBuffer(receiveSendToken.bufferOffsetReceive, this.socketListenerSettings.BufferSize);
bool willRaiseEvent = receiveSendEventArgs.AcceptSocket.ReceiveAsync(receiveSendEventArgs);
if (!willRaiseEvent)
{
ProcessReceive(receiveSendEventArgs);
}
rec.Dequeue();
IsExecuted = true;
}
catch
{
IsExecuted = false;
StartReceive(receiveSendEventArgs);
}
}
尋找一個體面的幫助或一些好的方向
有幫助嗎?我想要它:( –
)如果我把這件事情做對了,你將有關SAEA對象的信息作爲一個UserToken傳遞給同一個對象,你爲什麼要那樣做? 而且有一件事情是跳到我身上的就是你使用System.Collections.Queue類而不是推薦的System.Collections.Generic.Queue類。如果其他人正在工作,也許切換到泛型類將會有所幫助。 –
HaMster