分享WCF文件传输---WCFFileTransfer

前几天分享了分享了WCF聊天程序--WCFChat ,本文和大家一起分享利用WCF实现文件的传输。
程序运行效果
接收文件端:
分享WCF文件传输---WCFFileTransfer
发送文件端:连接WCF服务,选择要传输的文件
分享WCF文件传输---WCFFileTransfer
文件传输成功:
分享WCF文件传输---WCFFileTransfer
我们会在保存文件的默认路径:C:\Documents and Settings\Administrator\桌面,下看到传输的文件:
分享WCF文件传输---WCFFileTransfer

代码分析
这里就不一一的阐述每一句代码的作用了,感兴趣的朋友可以下载,文后会有下载链接。说下值得注意的地方:
前两天有人在百度知道中问能不能把WCF中的契约单独封装到一个类库中,当时感觉多此一举,无意中看到把接口单独分出去,有个很好的应用,就是利用通道实现客户端代理。
ITransfer.cs
分享WCF文件传输---WCFFileTransfer分享WCF文件传输---WCFFileTransferCode
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.ServiceModel;
usingSystem.Runtime.Serialization;
usingSystem.Threading;
usingSystem.IO;

namespaceFileInterface
{
[ServiceContract]
publicinterfaceITransfer
{
[OperationContract(Action
="UploadFile")]
voidTransferFile(FileTransferMessagerequest);//文件传输
}


[MessageContract]
publicclassFileTransferMessage
{
[MessageHeader(MustUnderstand
=true)]
publicstringSavePath;//文件保存路径

[MessageHeader(MustUnderstand
=true)]
publicstringFileName;//文件名称

[MessageBodyMember(Order
=1)]
publicStreamFileData;//文件传输时间
}
}
利用通道创建客户端代理:
分享WCF文件传输---WCFFileTransfer分享WCF文件传输---WCFFileTransferCode
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->if(_proxy==null)
{
try
{
NetTcpBindingbinding
=newNetTcpBinding();
binding.TransferMode
=TransferMode.Streamed;
binding.SendTimeout
=newTimeSpan(0,30,0);
//利用通道创建客户端代理
_proxy=ChannelFactory<ITransfer>.CreateChannel(binding,newEndpointAddress(CBSerURL.Text));
IContextChannelobj
=_proxyasIContextChannel;
//strings=obj.SessionId;

}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
return;
}
这样,既不用添加服务引用,也不需要生成代理。
文件传输的函数不是很难,代码如下:
分享WCF文件传输---WCFFileTransfer分享WCF文件传输---WCFFileTransferCode
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicvoidTransferFile(FileTransferMessagerequest)
{
stringlogInfo;

Program.Get_ILog().Log(logInfo
=string.Format("开始接收文件,name={0}",request.FileName));//填写日志
//文件信息
stringuploadFolder=AppValue.GetParam()._saveDir;
stringsavaPath=request.SavePath;
stringfileName=request.FileName;
StreamsourceStream
=request.FileData;
FileStreamtargetStream
=null;
//判断文件是否可读
if(!sourceStream.CanRead)
{
thrownewException("数据流不可读!");
}
if(savaPath==null)savaPath=@"文件传输\";
if(!savaPath.EndsWith("\\"))savaPath+="\\";
if(!uploadFolder.EndsWith("\\"))uploadFolder+="\\";

uploadFolder
=uploadFolder+savaPath;
//创建保存文件夹
if(!Directory.Exists(uploadFolder))
{
Directory.CreateDirectory(uploadFolder);
}

intfileSize=0;
stringfilePath=Path.Combine(uploadFolder,fileName);//Combine合并两个路径
try
{
//文件流传输
using(targetStream=newFileStream(filePath,FileMode.Create,FileAccess.Write,FileShare.None))
{
//定义文件缓冲区
constintbufferLen=4096;
byte[]buffer=newbyte[bufferLen];
intcount=0;

while((count=sourceStream.Read(buffer,0,bufferLen))>0)
{
targetStream.Write(buffer,
0,count);
fileSize
+=count;
}
targetStream.Close();
sourceStream.Close();
}
}
catch(Exceptionex)
{
Program.Get_ILog().Log(logInfo
+ex.Message);
}

Program.Get_ILog().Log(
string.Format("接收文件完毕name={0},filesize={1}",
request.FileName,fileSize));
}

其他的代码感兴趣的朋友下载来研究吧!


源代码:

/Files/gaoweipeng/WCFFileTransfer.rar