您好所有我有这个问题,我坚持了下来,所以任何帮助,将不胜感激套接字队列问题
我必须建立一个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