Beispiel #1
0
        //通过socketFile通道下载文件信息
        internal async static void DownloadFile(string path, StreamSocket socket)
        {
            HandleFileModel handlefileModel = new HandleFileModel();

            handlefileModel.Msg  = path;
            handlefileModel.Typ  = "FileDownload";
            handlefileModel.Name = "";
            handlefileModel.Size = 0;

            string sendmessage = JsonConvert.SerializeObject(handlefileModel);

            byte[] buffer = new byte[sendmessage.Length];
            buffer = Encoding.UTF8.GetBytes(sendmessage);
            //Encoding.UTF8.GetBytes(sendmessage,0,sendmessage.Length,buffer,0);

            using (DataWriter writer = new DataWriter(socket.OutputStream))
            {
                try
                {
                    writer.WriteBytes(buffer);
                    await writer.StoreAsync();      //提交数据

                    await writer.FlushAsync();      //刷新数据

                    writer.DetachStream();          //分离流
                    writer.Dispose();               //关闭
                }
                catch (Exception e)
                {
                    Debug.WriteLine(e.Message);
                    //await new MessageDialog(e.Message).ShowAsync();
                    //socket.Dispose();
                    return;
                }
            }
        }
Beispiel #2
0
        //接收文件上传命令
        internal static void ReceiveFileSocket(object obj)
        {
            Socket s = obj as Socket;
            //用于接收文件信息,得到文件长度
            int BUFFERSIZE = 10 * 1024;

            byte[]          buffer         = new byte[BUFFERSIZE];
            byte[]          recvfilebuffer = new byte[0];
            byte[]          temp;
            int             filelength      = 0;
            string          filename        = "";
            int             count           = 0;
            HandleFileModel handlefileModel = null;

            while (true)
            {
                try
                {
                    //请求接收BUFFERSIZE个字节的数据,实际接收count字节
                    count = s.Receive(buffer, SocketFlags.None);
                    temp  = new byte[count];
                    temp  = GetSocketBuffer(temp, buffer);
                    //recvfile累加
                    recvfilebuffer = recvfilebuffer.Concat(temp).ToArray();
                }
                catch (ArgumentNullException)
                {
                    //MessageBox.Show("发送的东西为空");
                    // s.Dispose();
                    //InfoHandle.threadDisk.Abort();
                    return;
                }
                catch (SocketException)
                {
                    //MessageBox.Show("访问套接字失败");
                    return;
                }
                catch (ObjectDisposedException)
                {
                    //MessageBox.Show("Socet已断开");
                    return;
                }
                try
                {
                    string message = Encoding.UTF8.GetString(temp);

                    message = Msg.HandleRcvMsg(message);
                    Debug.WriteLine("SocketFile接收的信息" + message);

                    if (message.Contains("Size") && message.Contains("Name"))
                    {
                        string[] info = message.Split('}');
                        message = info[0] + "}";

                        handlefileModel = JsonConvert.DeserializeObject <HandleFileModel>(message);
                        //文件下载时handlefileModel.Size为0,主要用于文件上传
                        filelength = (int)handlefileModel.Size;
                        Debug.WriteLine("SocketFile接收的文件大小" + filelength);
                        filename = handlefileModel.Name;
                        // temp = new byte[10];
                        recvfilebuffer = new byte[0];

                        //根据文件大小,设置缓冲区大小
                        int len = (int)handlefileModel.Size / (1024 * 1024 * 1);
                        BUFFERSIZE = SetBUFFERSIZE(len);
                        buffer     = new byte[BUFFERSIZE];
                    }
                    //如果接收的数据到达文件长度
                    else if (recvfilebuffer.Length >= filelength)
                    {
                        if (filelength > 0)
                        {
                            //temp=temp.Concat(buffer).ToArray();
                            handlefileModel = null;
                            string savepath = "C:\\Users\\" + Environment.UserName + "\\Desktop" + '\\' + filename;

                            //filebuffer.CopyTo(temp,10);
                            File.WriteAllBytes(savepath, recvfilebuffer);
                        }
                    }

                    /*
                     * else if(handlefileModel!=null)
                     * {
                     *  handlefileModel.Typ = null;
                     * }*/
                }
                catch (Exception)
                {
                    // MessageBox.Show("文件传输错误");
                }

                if (handlefileModel != null)
                {
                    /*if (handlefileModel.Typ == "FileUpload")
                     * {
                     *  byte[] filebuffer = new byte[handlefileModel.Size];
                     *  try
                     *  {
                     *      InfoHandle.m.rcvMsg = "文件接收中";
                     *      s.Receive(filebuffer);
                     *  }
                     *  catch (ArgumentNullException ex)
                     *  {
                     *      //MessageBox.Show("发送的东西为空");
                     *      // s.Dispose();
                     *      //InfoHandle.threadDisk.Abort();
                     *      return;
                     *  }
                     *  catch (SocketException ex)
                     *  {
                     *      //MessageBox.Show("访问套接字失败");
                     *      return;
                     *  }
                     *  catch (ObjectDisposedException ex)
                     *  {
                     *      //MessageBox.Show("Socet已断开");
                     *      return;
                     *  }
                     *
                     *
                     *
                     * }
                     */
                    if (handlefileModel.Typ == "FileDownload")
                    {
                        SendFileSocket(handlefileModel, App.serverSocketFile);
                    }
                }
            }
        }
Beispiel #3
0
        //通过socketFile通道上传文件信息
        internal async static void SendFile(FileModel fileModel, StreamSocket socketFile)
        {
            //FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
            //file.OpenStreamForReadAsync();
            Stream          filestream      = null;
            HandleFileModel handlefilemodel = new HandleFileModel();

            handlefilemodel.Typ  = "FileUpload";
            handlefilemodel.Name = fileModel.fileName;
            handlefilemodel.Msg  = null;
            filestream           = await fileModel.file.OpenStreamForReadAsync();

            handlefilemodel.Size = filestream.Length;
            //如果文件内容大小大于100M
            if (handlefilemodel.Size > 100 * 1024 * 1024)
            {
                await new MessageDialog("文件过大,无法上传").ShowAsync();
                return;
            }
            int len        = (int)handlefilemodel.Size / (1024 * 1024 * 1);
            int BUFFERSIZE = SetBUFFERSIZE(len);

            string sendmessage = JsonConvert.SerializeObject(handlefilemodel);

            Debug.WriteLine("SocketFile发送的命令:" + sendmessage);
            byte[] buffer = null;
            buffer = new byte[sendmessage.Length];

            buffer = Encoding.UTF8.GetBytes(sendmessage);


            if (App.IsConnect == true)
            {
                using (DataWriter writer = new DataWriter(socketFile.OutputStream))
                {
                    writer.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                    try
                    {
                        writer.WriteBytes(buffer);
                        await writer.StoreAsync();


                        byte[] buffer1 = new byte[BUFFERSIZE];
                        byte[] sendbuffer;
                        //从文件中以流的方式读取,,返回值为实际读取字节数
                        //当读到文件流末尾时返回0
                        int length = filestream.Read(buffer1, 0, BUFFERSIZE);
                        sendbuffer = new byte[length];
                        sendbuffer = GetSendBuffer(sendbuffer, buffer1);
                        //length为每次实际读取的字节数,当为0
                        //时就是文件流的末尾
                        while (length > 0)
                        {
                            writer.WriteBytes(sendbuffer);
                            //线程停止10毫秒
                            try
                            {
                                await Task.Delay(10);
                            }
                            catch (Exception)
                            {
                            }
                            await writer.StoreAsync();

                            //从文件中以流的方式读取,,返回值为实际读取字节数
                            //当读到文件流末尾时返回0
                            length     = filestream.Read(buffer1, 0, BUFFERSIZE);
                            sendbuffer = new byte[length];
                            sendbuffer = GetSendBuffer(sendbuffer, buffer1);
                        }
                        //writer.WriteBytes(buffer);

                        await filestream.FlushAsync();

                        filestream.Dispose();

                        await writer.FlushAsync();

                        writer.DetachStream();
                        writer.Dispose();
                        await new MessageDialog("文件上传完毕").ShowAsync();
                    }

                    catch (Exception e)
                    {
                        Debug.WriteLine(e.Message);
                        // await new MessageDialog(e.Message).ShowAsync();
                        //writer.Dispose();
                        return;
                    }
                }
            }
            else
            {
                await new MessageDialog("请先连接").ShowAsync();
            }
        }
Beispiel #4
0
        //向客户端发送要下载文件信息
        public static void SendFileSocket(HandleFileModel handlefileModel, object obj)
        {
            Socket s = obj as Socket;

            byte[]     buffer           = null;
            byte[]     filelengthbuffer = null;
            FileStream fstream;


            try
            {
                fstream = new FileStream(handlefileModel.Msg, FileMode.Open);
            }
            catch (Exception)
            {
                //MessageBox.Show("文件获取失败");
                return;
            }



            //100M文件
            if (fstream.Length > 100 * 1024 * 1024)
            {
                MessageBox.Show("文件过大,无法下载");
                return;
            }

            //文件大小
            string filelength = fstream.Length.ToString();

            filelengthbuffer = new byte[sizeof(Int32)];
            filelengthbuffer = BitConverter.GetBytes(Convert.ToInt32(fstream.Length));
            //Encoding.UTF8.GetBytes(filelength,0,filelength.Length,filelengthbuffer,0);

            int len        = (int)fstream.Length / (1024 * 1024 * 1);
            int BUFFERSIZE = SetBUFFERSIZE(len);

            //读流的缓冲区
            buffer = new byte[BUFFERSIZE];
            try
            {
                //发送文件大小
                s.Send(filelengthbuffer, sizeof(Int32), SocketFlags.None);
                Debug.WriteLine("SocketFile发送文件大小:" + filelength);
                Thread.Sleep(10);


                byte[] sendfilebuffer;
                //实际读取的字节数,count
                int count = fstream.Read(buffer, 0, BUFFERSIZE);

                //发送的数据
                sendfilebuffer = new byte[count];
                sendfilebuffer = GetSocketBuffer(sendfilebuffer, buffer);
                //Thread.Sleep(1000);
                //每次向BUFFERSIZE大小的缓冲区读字节,读多少发多少,直到文件读完为止
                while (count > 0)
                {
                    //发送
                    s.Send(sendfilebuffer, 0, sendfilebuffer.Length, SocketFlags.None);
                    Thread.Sleep(10);

                    count = fstream.Read(buffer, 0, BUFFERSIZE);

                    //发送的数据
                    sendfilebuffer = new byte[count];
                    sendfilebuffer = GetSocketBuffer(sendfilebuffer, buffer);
                }
                Debug.WriteLine("SocketFile发送文件完毕!");
                fstream.Flush();
                fstream.Dispose();
                fstream.Close();



                //s.Send(filebuffer,(int)handlefileModel.Size,Convert.ToInt32(filelength),SocketFlags.None);
            }
            catch (ArgumentNullException)
            {
                return;
            }
            catch (SocketException)
            {
                return;
            }
            catch (ObjectDisposedException)
            {
                return;
            }
        }