第10章 网络编程和分布式开发.ppt_第1页
第10章 网络编程和分布式开发.ppt_第2页
第10章 网络编程和分布式开发.ppt_第3页
第10章 网络编程和分布式开发.ppt_第4页
第10章 网络编程和分布式开发.ppt_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章网络编程和分布式开发 本章要点 对网络编程的感性认识了解Socket用Socket进行通信 10 1使用SMTP服务 电子邮件可能是大家最经常使用的网络服务之一 而SMTP 简单邮件传输协议 就是定义电子邮件传送服务的协议 在这个案例中 我们将学习如何使用VisualBasic NET进行SMTP编程 10 1 1安装和配置SMTP服务本案例将开发一个简单的电子邮件客户端 它利用系统的SMTP服务来发送电子邮件 为了让这个程序能够顺利运行 请你确认自己的计算机上安装有SMTP服务 或者确保自己能够访问某台邮件服务器 如果你希望使用自己的SMTP服务器 那么需要做如下一些配置 1 若不能确定是否安装有SMTP服务 请打开 控制面板 管理工具 Internet信息服务 如果看到有 默认SMTP虚拟服务器 项 说明SMTP服务已经安装 2 确认已经安装了SMTP服务之后 在 默认SMTP虚拟服务器 上单击鼠标右键 在弹出菜单中选择 属性 弹出 默认SMTP虚拟服务器属性 对话框 3 选择 访问 选项卡 用鼠标单击 中继 按钮 在弹出的 中继限制 对话框中 选中 仅以下列表除外 并且确保所用的计算机没有出现在下面的 计算机 列表中 一般来说 这个列表都是空的 单击 确定 保存设置 这时 计算机就可以利用系统的SMTP服务来传送电子邮件了 10 1 2设计邮件发送程序新建一个Windows窗体应用程序Case10 1 为这个应用程序添加对System Web组件的引用 步骤如下 1 在 解决方案资源管理器 中 用鼠标右键单击 引用 在弹出菜单中选择 添加引用 2 在 添加引用 对话框中找到 System Web dll 组件 用鼠标双击它 让它出现在下面的 选定的组件 框中 3 单击 确定 按钮 就可以看到对System Web的引用出现在 解决方案资源管理器 中 10 1 3发送邮件 10 1 4点评 网络编程 NET框架包装了许多常用的网络协议功能 让程序员可以方便地进行网络编程 尽管如此 网络编程仍然是一个专业性比较强的领域 需要程序员对各种网络协议有一定的了解 10 2使用Socket获取数据 在上一小节中 我们虽然也跟网络打了交道 但是并没有做到真正意义上的 网络编程 在这一节中就将真正地使用到TCP IP Socket等一些概念 如果要看懂本节的示例 你需要对TCP IP以及Socket编程有一定的了解 本案例要做的事情是通过Socket取得一张网页的源代码 这就相当于浏览器在显示网页之前所要做的工作 我们得到的数据是一大篇的字符 如果你了解HTML语言 就会发现那实际上是一篇HTML文档 10 2 1窗体设计新建一个Windows窗体应用程序Case10 2 在窗体中放入一个文本框txtUrl 把它的Text属性设置为 在它的旁边加入一个按钮控件 命名为btnOpen 将它的Text属性设置为 打开 最后再放入一个文本框控件 获取的页面源代码DimsPageSourceAsString 缓冲从服务器获取的字节流DimabyteReceive 1024 AsByte 构造HTTPGET请求DimsGetAsString GET HTTP 1 0 vbCrLf Host txtUrl Text vbCrLf Connection Close vbCrLf vbCrLfDimasciiGetAsEncoding Encoding ASCII 将GET请求转换为ASCII编码DimabyteGet AsByte asciiGet GetBytes sGet Try 从DNS获取服务器IP地址DimhostentryAsIPHostEntry Dns GetHostByName txtUrl Text DimhostaddAsIPAddress hostentry AddressList 0 构造服务器的网络端点对象 IP地址和端口号 DimEPhostAsIPEndPoint NewIPEndPoint hostadd 80 建立一个新的套接字DimsockHTTPAsSocket NewSocket AddressFamily InterNetwork SocketType Stream ProtocolType Tcp 尝试连接到服务器sockHTTP Connect EPhost IfsockHTTP Connected FalseThentxtPageSource Text 无法连接到服务器 ExitSubEndIf 发送HTTPGET请求sockHTTP Send abyteGet abyteGet Length 0 从Socket中读取数据 并将字节流转换为字符串DimiBytesAsInteger 1DoWhileiBytes 0iBytes sockHTTP Receive abyteReceive abyteReceive Length 0 sPageSource asciiGet GetString abyteReceive 0 iBytes LoopsockHTTP Close sockHTTP NothingCatchexAsExceptionMessageBox Show ex Message EndTrytxtPageSource Text sPageSource最后还要在代码窗口最上方添加对三个命名空间的引用 ImportsSystem TextImportsSystem NETImportsSystem NET Sockets 10 2 2获取网页 10 2 3点评 Socket和HTTP协议本节的程序虽然不长 但是概念却很多 下面逐行解释一下 首先是构造HTTP的GET请求的代码段 构造HTTPGET请求DimsGetAsString GET HTTP 1 0 vbCrLf Host txtUrl Text vbCrLf Connection Close vbCrLf vbCrLf这个请求的格式并不是随心所欲的 而是由HTTP协议所规定的 如果你有兴趣 可以对这个语句做些修改 使得GET请求不符合HTTP协议的规定 譬如改成 DimsGetAsString GET HTP 1 0 vbCrLf Host txtUrl Text vbCrLf Connection Close vbCrLf vbCrLf请求中的 GET HTTP 1 0 改成了 GET HTP 1 0 将得到如图10 16所示的数据 10 3编写Client Server通信程序 Socket是在网络编程时使用最多的概念 对它的全面叙述可以写成一本书 当然 现在没有必要对Socket了解得那么透彻 深入学习的办法就是学习一个更加复杂的案例 10 3 1Client和Server本案例的内容是编写一个简单的通过TCP协议在自定义端口进行通信的程序 它包括两个部分 一个Server端 一个Client端 Server端在指定的端口进行监听 一旦接收到数据就把它显示出来 Client端则可以发送数据 10 3 2建立解决方案由于在这个案例中有两个程序 所以首先要新建的不是一个项目 而是一个空白的解决方案 单击 文件 新建 空白解决方案 解决方案仍然按照惯例 起名为Case10 3 新建之后 好像什么都没有发生 现在可以新建一个项目 命名为Server 记得在 新建项目 对话框中选择 添入解决方案 而不是 关闭解决方案 以同样的步骤 再加入一个项目Client 它们将分别位于Case10 3文件夹下的Server和Client文件夹中 完成之后 可以在 服务器解决方案管理器 中看到这两个项目 10 3 3Server部分在Server窗体上加入一个ListBox 命名为lstClient 再加入一个Button 命名为btnStart 设置其Text为 启动 在Server的Form1类定义内部 加入如下代码 DimserverThreadAsThreadDimtcpListenerAstcpListenerDimnetStreamAsNetworkStreamDimrdStreamAsStreamReaderDimwtStreamAsStreamWriterDimclientSocketAsSocketPrivateSubListen DimclientMsgAsStringtcpListener NewTcpListener 1111 Try tcpListener Start clientSocket tcpListener AcceptSocket IfclientSocket ConnectedThenlstClient Items Add newuser netStream NewNetworkStream clientSocket rdStream NewStreamReader netStream wtStream NewStreamWriter netStream EndIfWhile True clientMsg rdStream ReadLine IfclientMsg Exit ThenExitSubEndIflstClient Items Add clientMsg EndWhileCatchexAsSocketExceptionMessageBox Show 无法打开端口 CatchexAsIOException 流被关闭CatchexAsThreadAbortException 线程正常中止 CatchexAsExceptionMessageBox Show ex Message EndTryEndSubPrivateSubEndListen If NotnetStreamIsNothing ThenrdStream Close wtStream Close netStream Close clientSocket Shutdown SocketShutdown Both clientSocket Close EndIfIf NotserverThreadIsNothing ThenserverThread Abort tcpListener Stop EndIfEndSubPrivateSubbtnStart Click ByValsenderAsSystem Object ByValeAsSystem EventArgs HandlesbtnStart Click TryserverThread NewThread AddressOfListen serverThread Start CatchexAsExceptionMessageBox Show ex Message EndTryEndSubPrivateSubForm1 Closing ByValsenderAsObject ByValeAsSystem ComponentModel CancelEventArgs HandlesMyBase ClosingEndListen EndSub然后在代码窗口顶部添加三句引用命名空间的命令 ImportsSystem NET SocketsImportsSystem IOImportsSystem Threading 10 3 4Client部分Client部分的窗体同样简单 一个TextBox 命名为txtMsg 一个Button 命名为btnConnect Text属性为 连接 另外一个Button 命名为btnSend Text属性为 发送 在Client的Fom1类定义内部 加入以下代码 DimtcpClientAstcpClientDimnetStreamAsNetworkStreamDimrdStreamAsStreamReaderDimwtStreamAsStreamWriterPrivateSubbtnConnect Click ByValsenderAsSystem Object ByValeAsSystem EventArgs HandlesbtnConnect ClickTrytcpClient NewTcpClient localhost 1111 netStream tcpClient GetStream rdStream NewStreamReader netStream wtStream NewStreamWriter netStream CatchexAsException MessageBox Show 无法连接服务器 EndTryEndSubPrivateSubbtnSend Click ByValsenderAsSystem Object ByValeAsSystem EventArgs HandlesbtnSend ClickTrywtStream WriteLine txtMsg Text wtStream Flush CatchexAsExceptionMessageBox Show 无法发送消息 EndTryEndSubPrivateSubForm1 Closing ByValsenderAsObject ByValeAsSystem ComponentModel CancelEventArgs HandlesMyBase ClosingwtStream WriteLine Exit wtStream Flush EndSub 10 3 5生成可执行文件由于这个解决方案中有两个项目 所以生成可执行文件的过程与以前见到的项目不同 选择Server项目 在 生成 菜单中会出现 生成Server 而在选择Client项目的时候 同样的地方会出现 生成Client 两者都要运行一次 这样才能生成两个可执行文件 10 3 6启动Server如果直接按F5键启动程序 它多半只会启动Server 因为一个解决方案只能有一个启动项目 所以比较好的办法是通过资源管理器来启动 Server exe文件在Case6 5 Server bin文件夹下 而Client exe文件在Case6 5 Client bin文件夹下 启动这两个程序 在Server窗体上按下 启动 按钮 这样服务器程序就启动了 10 3 7启动Client并且连接到Server 10 3 8监听和连接先看看Server的主要代码 启动监听的代码 经过精简 如下所示 tcpListener NewTcpListener 1111 tcpListener Start clientSocket tcpListener AcceptSocket TcpListener扮演的就是 监听者 的角色 它可以接受很多参数 这里使用构造函数接受一个整数 告诉它应该在哪一个端口监听 程序中使用1111端口 应该说 只要不把Server启动两次 是不会有其他程序占用这个端口的 接着用Start方法正式启动监听 接下来的AcceptSocket方法会等待 一直到有Client来连接 它就返回一个Socket对象 而有了Socket 就可以发送和接收数据了 有了Socket之后 用它来初始化一个NetworkStream流 netStream NewNetworkStream clientSocket rdStream NewStreamReader netStream wtStream NewStreamWriter netStream 把网络传输看成流 可以让我们用与文件读写相同的方法来对待网络传输 因此可以对它使用StreamReader和StreamWriter Server在完成了这些初始化工作之后 它的生命就要花在一个无限循环上了 While True clientMsg rdStream ReadLine IfclientMsg Exit ThenExitSubEndIflstClient Items Add clientMsg EndWhile它不断地检查网络上有没有新数据到来 如果是 Exit 就退出 否则就把它显示到lstClient中 本例在某种程度上实现了一个简单的协议 Server端与Client端商定 当然不是真的商定 一切都是人为操纵的 在Client退出的时候发送 Exit 让Server也退出 否则双方就一直通讯 值得一提的是 为了不让这个无限循环占用Server的所有时间 需要把它作为一个线程来运行 serverThread NewThread AddressOfListen serverThread Start 关于线程 在第11章中有详细讲解 在这里 只需要知道线程可以让应用程序拥有同时处理多件事情的能力 这样 Server程序才不会一直忙于监听网络而无暇接受用户操作 最后 在Server退出的时候 要释放所有占用的资源 在EndListen中 这一点十分重要 下面来看Client 它连接网络的方式与Server很相像 但是Client不必监听 tcpClient NewTcpClient localhost 1111 netStream tcpClient GetStream rdStream NewStreamReader netStream wtStream NewStreamWriter netStream 设想一下 Server是商店里的店员 Client是顾客 这个逻辑就很容易理解了 店员不管有没有顾客 都要坚守岗位 随时准备提供服务 而顾客可以随心所欲地四处闲逛 同样 在发送数据的时候 Client也处于相当自由的地位 它只需要在想发的时候发出去就行了 wtStream WriteLine txtMsg Text wtStream Flush 为了遵守我们制定的 协议 它在退出的时候 应该发送 Exit 给服务器 PrivateSubForm1 Closing ByValsenderAsObject ByValeAsSystem ComponentModel CancelEventArgs HandlesMyBase ClosingwtStream WriteLine Exit wtStream Flush EndSub 10 4使用消息队列发送消息 微软公司几年前就在Windows中引入了消息队列 MSMQ 它让一个进程或者设备在任何情况下都可以向别的进程或者设备发送信息 进程或者设备使用消息队列来通信的方式 有点类似于人们发电子邮件来互相交流 发送电子邮件的一方随时都可以发送 如果接收电子邮件的一方当时并没有在线检查电子邮件 电子邮件就会被储存起来 等待接收方检查 如果接收方当时在线 那么电子邮件就可以马上得到处理 这种方式叫做 异步 通信 它不要求双方以统一步调做一件事情 相反 不是用消息队列的通信方式就有点类似打电话 双方必须都在电话旁边才可以通信 这种方式叫做 同步 通信 同步和异步各有其优点和不足 但是在微软公司引入消息队列以前 在Windows系统中实现异步通信是比较麻烦的 但是我们会看到 使用了消息队列 这个过程相当简单 10 4 1查看消息队列本节所做的事情与10 3节有些相像 都是一个Client与一个Server通信 但是10 3节使用的是Socket的同步通信 而本节将会使用消息队列做异步通信 要运行这个案例 应该保证自己的计算机上安装了消息队列 如果不能确定 请打开 控制面板 管理工具 计算机管理 展开左边目录树中的 服务和应用程序 如果看到了图10 26所示中的 消息队列 项 说明计算机上已经安装了消息队列服务 如果没有 那就应该从Windows安装光盘中安装 步骤如下 打开 控制面板 添加或删除程序 选择 添加 删除Windows组件 弹出 Windows组件向导 列表中的最后一项就是 消息队列 选中 消息队列 旁边的复选框 然后单击 下一步 根据系统提示 就可以完成消息队列的安装了 10 4 2设计消息发送窗体 10 4 3建立一个消息队列随后 要在系统中建立一个新的消息队列 在 控制面板 管理工具 计算机管理 中 展开左边目录树中的 服务和应用程序 找到 消息队列 它包括三种队列 传出队列 系统队列和专用队列 在 专用队列 项上单击鼠标右键 选择 新建 专用队列 在弹出的 新建专用队列 对话框中 填入 myMessage 作为新队列的名称 不要选择 事务性 复选框 单击 确定 按钮 系统就会新建一个名叫myMessage的专用队列 双击 专用队列 文件夹 就可以查看到它 以上的过程也可以在VisualStudio NET的服务器资源管理器中完成 接下来就可以为程序添加消息队列了 在VisualStudio NET中打开服务器资源管理器 将它展开成如图10 32所示的样子 就可以看到刚才建立的myMessage专用队列了 将这个队列拖动到窗体上放下 就会在窗体下方的不可见控件区看到消息队列组件MessageQueue

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论