你好,我有这个问题,我坚持下去,所以任何帮助将不胜感激
我必须建立一个套接字聊天(客户端服务器)模块,我已经完成了近80%的工作,但现在我被卡住了,情景是我有一个服务器应用程序,客户端现在连接到它,如果说4个客户端是连接到服务器,每个服务器可以相互通信,一个客户端将发送消息,服务器将接收该消息并将其传递,这是非常好的,但当2个或更多客户端同时向第三个客户端发送消息时我不能得到一条消息和客户端断开连接我知道我必须建立一个队列结构,但我没有在这里成功 这是我的代码结构
StartReceive(SocketAsyncEventArgs) ->
首先,我将此方法称为开始侦听传入消息
当我收到一条消息时,我会检查它是否已完成同步或异步
之后有一个io完成的监听器,每次完成一个接收操作时调用,并且在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但它无法正常工作
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);
}
}
寻找体面的帮助或一些好的方向
答案 0 :(得分:1)
我不确定这是否是您问题的根本原因,但在我看来,您在某个时间用尽DataHoldingUserToken
因为您从未对您出列的对象做任何事情,因此您扔掉它。
另请注意,建议对非平凡对象使用Queue类的通用形式。那将是System.Collections.Generic.Queue<DataHoldingUserToken>
。