2013-08-02 72 views
0

您好所有我有这个问题,我坚持了下来,所以任何帮助,将不胜感激套接字队列问题

我必须建立一个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); 
     } 
    } 

寻找一个体面的帮助或一些好的方向

+0

有帮助吗?我想要它:( –

+0

)如果我把这件事情做对了,你将有关SAEA对象的信息作为一个UserToken传递给同一个对象,你为什么要那样做? 而且有一件事情是跳到我身上的就是你使用System.Collections.Queue类而不是推荐的System.Collections.Generic.Queue 类。如果其他人正在工作,也许切换到泛型类将会有所帮助。 – HaMster

回答

1

我不确定这是否是问题的根源,但它似乎对我来说,您在某个时间用完DataHoldingUserToken是因为您从未对您出列的物品做过任何处理,因此您将其扔掉。

另请注意,建议使用非平凡对象的Queue类的通用形式。那将是System.Collections.Generic.Queue<DataHoldingUserToken>

+0

感谢HAmster为您的宝贵时间我正在等待答案,并意味着,当我重新读取我的整个代码,我发现问题,真正的问题是与过程接收方法,我正在处理其他东西在过程接收部分,但它被搞乱了,所以我从进程接收中删除队列,现在它在某种程度上工作,并且你说我只是在出队后抛出对象,以及我在处理这些对象时接收并非常感谢你。建议通用队列的我想知道我没有使用这个,我现在会去用它:) –