功能介绍 主要是使用WCF框架实现从客户端上传图片到服务端并在服务端显示的基本功能 一首先创建两Windows窗体应用程序WinFormClient(客户端发送端)和WinFormReceiver(接收端) 如图设计FormClient(发送端窗体)的界面上边是一个panel容器中添加了一个TextBox和 两个Button下边是一个PictureBox控件(用于浏览上传之前的图片) 然后添加浏览按钮下的后台代码实现客户端浏览的功能 View Code string fileName = ;//定义一个全局变量 //浏览选择上传内容 private void btnBrowser_Click(object sender EventArgs e) { //string fileName = ;//定义一个字段用于获取上传的文件名 OpenFileDialog openFileDialog = new OpenFileDialog()//创建一个OpenFileDialog对象专门用于打开文件 if (openFileDialogShowDialog() == DialogResultOK)//打开的文件对话框如果选择了OK按钮(确定)则为真执行大括号中的内容 { fileName = openFileDialogFileName; txtPicNameText = fileName;//在textBox中显示文件名 pictureBoxLoad(fileName)//使该图片在客户端pictuBox中显示 } else return;//未选中文件则返回 } 将WinFomClient设为启动项目运行 当你选择图片后该图片会显示在发送端的窗体中供发送者浏览如需更改上传图片可重新选取该图片将会被覆盖掉(上传功能将在下文实现) FormReceiver接收端的窗体只需添加一个PictureBox控件用于显示客户端上传的图片 二在解决方案中添加两个类库ITransferPic(接口)TransferPic(继承接口)一个控制台应用程序 TransferPicHost(宿主程序) 该实例采用的是自身托管宿主并非IIS宿主 ITransferPic ()添加引用using SystemServiceModel; using SystemIO; ()创建一个ITransferPicService接口 View Code [ServiceContract] public interface ITransferPicService { [OperationContract]//操作契约 Stream GetPic() [OperationContract] void SendPic(Stream transferPic) } TransferPic ()添加引用using ITransferPic; using SystemIO; ()创建一个TransferPicService 类继承接口ITransferPicService并实现该接口 View Code public class TransferPicService : ITransferPicService { public static Stream PicSource = new MemoryStream() /// <summary> /// 从服务端下载图片到本地 (上传和下载都是拷贝的过程) /// </summary> /// <returns></returns> public Stream GetPic() { MemoryStream ms = new MemoryStream() PicSourcePosition = ;//指明从第位开始拷贝 PicSourceCopyTo(ms)//服务端将客户端的Stream复制一份 msPosition = ;//注意如果缺少该条代码接收端将无法显示上传图片 return ms;//然后在返回客户端 } /// <summary> /// 从客户端上传图片到服务端(将客户端的Stream拷贝给服务端的Stream) /// </summary> /// <param name=transferPic></param> public void SendPic(Stream transferPic) { PicSourcePosition = ; transferPicCopyTo(PicSource) } } TransferPicHose 自身托管宿主 利用WCF提供的ServiceHost<T>提供的Open()和Close()方法可以便于开发者在控制台应用程序Windows应用程序乃至于ASPNET应用程序中托管服务不管自宿主的环境是何种应用程序实质上托管服务的方式都是一致的如该实例中用到的代码部分 添加引用 using SystemServiceModel; using ITransferPic; using SystemServiceModelDescription; View Code class Program { static void Main(string[] args) { NetTcpBinding bind = new NetTcpBinding() bindMaxBufferSize = ; bindTransferMode = TransferModeStreamed; bindMaxReceivedMessageSize = ; bindSecurityMode = SecurityModeNone; //超出using 范围程序会自动释放 using (ServiceHost host = new ServiceHost(typeof(TransferPicTransferPicService))) { hostAddServiceEndpoint(typeof(ITransferPicService) bind nettcp://localhost:/transferPic)//该地址为宿主地址和客户端接收端地址保持一致 if (hostDescriptionBehaviorsFind<ServiceMetadataBehavior>() == null) { ServiceMetadataBehavior behavior = new ServiceMetadataBehavior() behaviorHttpGetEnabled = true; behaviorHttpGetUrl = new Uri(//localhost:/transferPic/metadata/) hostDescriptionBehaviorsAdd(behavior) } hostOpened += delegate { ConsoleWriteLine(图片程序已成功启动!) }; hostOpen() ConsoleReadLine() } } } 三实现上传 WinFormClient 后台上传按钮部分 添加引用 using SystemIO; using SystemServiceModel; using ITransferPic; View Code //执行上传功能 private void btnUpload_Click(object sender EventArgs e) { //pictureBoxLoad(fileName) //读取流上传文件流到服务器 FileStream fs = new FileStream(fileName FileModeOpen FileAccessRead)//创建一个文件并把文件放在文件流里边 Stream sm = new MemoryStream()//创建一个滤层流 将文件从第位拷贝到sm中 fsPosition = ;//获取或设置此流的当前位置 fsCopyTo(sm) //拷贝完成之后进行上传 EndpointAddress epAddr = new EndpointAddress(nettcp://localhost:/transferPic)//此处也可以用IIS做服务 NetTcpBinding bind = new NetTcpBinding()//绑定方式 bindMaxBufferPoolSize = ;//最大缓沖 bindTransferMode = TransferModeStreamed;//传输模式为流式处理 bindMaxReceivedMessageSize = ;//定义了服务端接收Message的最大长度防止文件过大 bindSecurityMode = SecurityModeNone;//安全模式设置为不进行验证 //创建一个工厂 ITransferPicService proxy = ChannelFactory<ITransferPicService>CreateChannel(bind epAddr) smPosition = ; proxySendPic(sm)//WCF客户端调用该方法 把客户端sm上传到服务端去 } WinFormReceiver 后台 添加引用 using ITransferPic; using SystemIO; using SystemServiceModel; View Code private void FormReceiver_Load(object sender EventArgs e) { Thread myThread = new Thread(ShowPic)//创建一个线程 myThreadIsBackground = true;//设置后台线程(防止主程序关闭后仍在运行) myThreadStart()//启动线程 } public void ShowPic() { #region 同客户端一样创建WCF客户端 EndpointAddress epAddr = new EndpointAddress(nettcp://localhost:/transferPic) NetTcpBinding bind = new NetTcpBinding() bindMaxBufferPoolSize = ; bindTransferMode = TransferModeStreamed; bindMaxReceivedMessageSize = ; bindSecurityMode = SecurityModeNone; //创建一个通道 ITransferPicService proxy = ChannelFactory<ITransferPicService>CreateChannel(bind epAddr) #endregion while (true) { Stream streamFromServer = proxyGetPic() //返回一个文件流 MemoryStream ms = new MemoryStream()//滤层流拷贝一份 msPosition = ; streamFromServerCopyTo(ms)//将该文件流拷贝给到ms; if (msLength == ) { SystemThreadingThreadSleep()//百毫秒执行一次 continue; } Bitmap tn = new Bitmap(ms)//创建一个位图把ms变成图片 pictureBoxImage = tn; SystemThreadingThreadSleep()//百毫秒执行一次Sleep表示当前线程挂起指定的时间 } } 四运行程序 打开TransferPicHost 文件中bin目录启动TransferPicHostexe此时会弹出一个控制台应用程序的窗体并提示图片功能已成功启动! 分别启动发送端和接收端项目程序 (将WinFormClient 或者 WinFormReceiver 设为启动项目并启动另一个项目文件夹bin目录下的WinFormReceiverexe或者WinFormClientexe) 点击发送端浏览按钮 进行选择图片之后点击上传按钮这时你会发现客户端上传的图片显示在了接收端的窗体上程序运行成功 |