//通过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; } } }
//接收文件上传命令 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); } } } }
//通过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(); } }
//向客户端发送要下载文件信息 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; } }