大家好,我有这个问题,我被它卡住了,所以任何帮助都将非常感谢
我必须构建一个socket chat (客户端服务器)模块,我已经完成了几乎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 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);
}
}寻找一个像样的帮助或一些好的方向
发布于 2013-08-19 18:14:54
我不确定这是否是你的问题的根源,但在我看来,你似乎在某个时候耗尽了DataHoldingUserToken,因为你从来没有对你出列的对象做任何事情,所以你把它扔掉了。
另请注意,对于非平凡对象,建议使用Queue类的泛型形式。那应该是System.Collections.Generic.Queue<DataHoldingUserToken>。
https://stackoverflow.com/questions/18014685
复制相似问题