首页 新闻 会员 周边

socketasynceventargs 同时接收多客户端文件的问题

0
悬赏园豆:40 [已解决问题] 解决于 2012-03-21 14:57

 http://www.cnblogs.com/tianzhiliang/archive/2010/09/08/1821623.html我用到这篇贴子的部分代码,不过我的服务器端是两个socketasynceventargs对象一个发送一个接收.下面是接收的方法...

private void ProcessReceive(SocketAsyncEventArgs e)
{
   if (e.LastOperation != SocketAsyncOperation.Receive)
      return;
if (e.BytesTransferred > 0)
{
if (e.SocketError == SocketError.Success)
{
   Int32 byteTransferred = e.BytesTransferred;
   string received = Encoding.Unicode.GetString(e.Buffer, e.Offset,byteTransferred);
 if(ms.Read(out socketHander)//ms是以流的方式对数据进行验证,返回一个socketHander对象,并且ms是针对每一个客户端创建的
   {
 
     OnMsgReceived(((MySocketAsyncEventArgs)e).UID, socketHander);
   }
     Boolean willRaiseEvent = (e.UserToken as Socket).ReceiveAsync(e);
      if (!willRaiseEvent)
       ProcessReceive(e);
      }
}
else
this.CloseClientSocket(((MySocketAsyncEventArgs)e).UID);
}
 
 
我现在的问题是,如果有多个客户端同时发送文件,一个文件的大小为10M左右,当一个用户的发送的文件还没有接收完成时,收到另外一个客户端的发送,会产生串包的问题,将不是该文件的流写入进去.请问在这方面有什么好的处理方法。。
< >
分享
最佳答案
0

這個 本來是多線程的哦。socket,你接到一個連接開一個線程。有公用的東西嗎?

收获园豆:40
無限遐想 | 老鸟四级 |园豆:3740 | 2012-03-21 11:00

  用的socketasynceventargs池

youngjunzhou | 园豆:22 (初学一级) | 2012-03-21 12:33

@youngjunzhou: 那也是 轉換到一個一個socket的。因此不會亂的。

    lock (this)
 
    {
 
        Socket socket = (args.UserToken as State).socket;
 
        if (socket.Connected)
 
        {
 
            socket.InvokeAsyncMethod(socket.ReceiveAsync,
 
                ReceivedCompleted, args);
 
        }
 
    }
無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-21 12:37

@無限遐想: 你要用異步調用哦。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-21 12:40

@無限遐想: 是的不会乱,它已经自动处理了每个socket的接收,但现在我又一个新问题,就是在接收的时候,一个文件还没有传输完成,这个ProcessReceive()方法就接收不到数据了.这是怎么回事呢..?

youngjunzhou | 园豆:22 (初学一级) | 2012-03-21 14:40

@youngjunzhou: 你 讀取 重新 用一個方法,開線程,不要用這個方法。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-21 14:43

@無限遐想: 你是说这个内部定义的自动循环接收的方法不可靠吗?就用一个线程来持久监听吗?这样这个线程会不会占用很多的CPU呢,必竟他要 while(true)

{

......

ProcessReceive();

}

youngjunzhou | 园豆:22 (初学一级) | 2012-03-21 14:52

@無限遐想: 有没有什么好的方法,如果它这儿收不到数据的话,整个传输就停止了,项目紧急啊。。

youngjunzhou | 园豆:22 (初学一级) | 2012-03-21 14:58

@youngjunzhou: 我大致看了一下。你給的網站,這個 應該是單線程的。就是同時,只能有一個客戶端上傳。他沒有把 ProcessAccept 這個方法 ,放入另一個線程的。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-21 15:00

@無限遐想: 

for (int i =0; i < m_numConnections; i++)
{
//Pre-allocate a set of reusable SocketAsyncEventArgs
readWriteEventArg =new SocketAsyncEventArgs();
readWriteEventArg.Completed
+=new EventHandler<SocketAsyncEventArgs>(IO_Completed);
readWriteEventArg.UserToken
=new AsyncUserToken();
// assign a byte buffer from the buffer pool to the SocketAsyncEventArg object
m_bufferManager.SetBuffer(readWriteEventArg);
// add SocketAsyncEventArg to the pool
m_readWritePool.Push(readWriteEventArg);
}

 

这里是初始化了连接池的,就是开始初始化了设定的N个连接,每个连接都是一个readWriteEventArg ,所以他们之间是不会交叉的。。也就是多线程

youngjunzhou | 园豆:22 (初学一级) | 2012-03-21 15:04

@youngjunzhou: 我知道。處理socket是多線程的。可是,處理接受的 數據的時候,你看看。就不對了。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-21 15:06

@無限遐想: 那你 怎麼處理的呢?

無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-21 15:07

@無限遐想: 我现在是用的它内部的循环机制啊。。让它接收数据,但是有时prossReceive这儿容易断掉,你说的是要在哪儿开一个线程。。你指一下哪个方法,谢谢。。

youngjunzhou | 园豆:22 (初学一级) | 2012-03-21 15:13

@youngjunzhou: socket.InvokeAsyncMethod(socket.ReceiveAsync,

 
                ReceivedCompleted, args);
就是 數據處理,再開一個線程。
無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-21 15:15

@無限遐想: 好的,谢谢,我去试试!

youngjunzhou | 园豆:22 (初学一级) | 2012-03-21 15:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册