【问题标题】:receving large file using Windows Phone socket使用 Windows Phone 套接字接收大文件
【发布时间】:2013-03-25 08:08:22
【问题描述】:

我正在使用套接字处理从桌面应用程序到 Windows Phone 应用程序的 sendig 文件。

我已经开发了桌面套接字服务器应用程序和 windows phone 应用程序(套接字客户端),两者都可以很好地处理小于 1MB 的文件,这意味着我可以将小于 1MB 的文件从桌面应用程序传输到 windows phone 应用程序。

现在我的问题是发送大文件导致应用程序崩溃,我已经调试了应用程序,但在一些迭代后它会挂起。

请检查下面的代码 sn-p 以了解 windows phone 端的文件接收逻辑。

代码:

    public string Receive()
    {
        string response = "Operation Timeout";
        int bytestrn = 0;
        int cnt = 0;
        byte[] data = new byte[2048 * 5000];
        if (socketClient != null)
        {                
            SocketAsyncEventArgs socketAsyncEventArgs = new SocketAsyncEventArgs();
            socketAsyncEventArgs.RemoteEndPoint = socketClient.RemoteEndPoint;
            socketAsyncEventArgs.SetBuffer(new Byte[MAX_BUFFER_SIZE*20000], 0, MAX_BUFFER_SIZE*20000);

            socketAsyncEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object sender, SocketAsyncEventArgs e)
            {
                cnt++;
                if (e.SocketError == SocketError.Success)
                {                      

                    try
                    {
                        bytestrn += e.BytesTransferred;
                        if (e.BytesTransferred > 0)
                        {

                            if (bytestrn >= 2501829)                                
                            {
                                Buffer.BlockCopy(e.Buffer, 0, data, bytestrn - e.BytesTransferred, e.BytesTransferred);                                    
                                int fileNameLen = BitConverter.ToInt32(data, 0);
                                string fileName = Encoding.UTF8.GetString(data, 4, fileNameLen);
                                IsoFileName = fileName;
                                IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();

                                using (BinaryWriter writeFile = new BinaryWriter(new IsolatedStorageFileStream(IsoFileName, FileMode.Create, FileAccess.Write, myIsolatedStorage)))
                                {
                                    writeFile.Write(data, 4 + fileNameLen, bytestrn - 4 - fileNameLen);                                        
                                    writeFile.Close();
                                }
                                clientDone.Set();
                            }
                            else
                            {
                                if (cnt == 1)
                                {
                                    Buffer.BlockCopy(e.Buffer, 0, data, 0, e.BytesTransferred);
                                    //e.Buffer.CopyTo(data, 0);
                                }
                                else
                                {
                                    Buffer.BlockCopy(e.Buffer, 0, data, bytestrn - e.BytesTransferred, e.BytesTransferred);
                                    //e.Buffer.CopyTo(data, bytestrn - e.BytesTransferred);
                                }

                                clientDone.Reset();
                                socketClient.ReceiveAsync(e);
                                clientDone.WaitOne();
                            }
                            string test = "if";
                        }
                        else
                        {
                            clientDone.Set();
                            string test = "else";
                        }
                        //clientDone.Set();
                    }
                    catch (Exception exp)
                    {
                        string hi = "hi";
                    }                        
                }
                else
                {
                    response = e.SocketError.ToString();
                }

                clientDone.Set();
            });

            clientDone.Reset();
            socketClient.ReceiveAsync(socketAsyncEventArgs);
            clientDone.WaitOne();
        }
        else
        {
            response = "Socket is not initialized";
        }  // end of: if (socketClient != null)

        return response;
    }

请尽快回复...

谢谢。

【问题讨论】:

    标签: c# windows-phone-7 asyncsocket socketasynceventargs


    【解决方案1】:

    每次传输以卡盘方式发送数据 [4096] 字节。为此,您需要在客户端和服务器上进行握手。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多