用C#实现TCP通信_第1页
用C#实现TCP通信_第2页
用C#实现TCP通信_第3页
用C#实现TCP通信_第4页
用C#实现TCP通信_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

用 C 实现基于 TCP 协议的网络通讯 TCP协议是一个基本的网络协议 基本上所有的网络服务都是基于 TCP协议的 如 HTTP FTP 等等 所以要了解网络编程就必须了解基于 TCP 协议的编程 然 而 TCP 协议是一个庞杂的体系 要彻底的弄清楚它的实现不是一天两天的功夫 所幸的是在 net framework 环境下 我们不必要去追究 TCP 协议底层的实现 一样可以很方便的编写出基于 TCP 协议进行网络通讯的程序 要进行基于 TCP 协议的网络通讯 首先必须建立同远程主机的连接 连接 地址通常包括两部分 主机名和端口 如 80 中 就是主机名 80 指主机的 80 端口 当然 主机名也可以用 IP 地址代替 当连接建立之后 就可以使用这个连接去发送和接收数据包 TCP 协议的作用就是保证这些数据包能到达终点并且能按照正确的顺序组装起来 在 net framework 的类库 Class Library 中 提供了两个用于 TCP 网 络通讯的类 分别是 TcpClient 和 TcpListener 由其英文意义显而易见 TcpClient 类是基于 TCP 协议的客户端类 而 TcpListener 是服务器端 监听 Listen 客户端传来的连接请求 TcpClient 类通过 TCP 协议与服务器进行通 讯并获取信息 它的内部封装了一个 Socket 类的实例 这个 Socket 对象被用 来使用 TCP 协议向服务器请求和获取数据 因为与远程主机的交互是以数据流 的形式出现的 所以传输的数据可以使用 net framework 中流处理技术读写 在我们下边的例子中 你可以看到使用 NetworkStream 类操作数据流的方法 在下面的例子中 我们将建立一个时间服务器 包括服务器端程序和客户 端程序 服务器端监听客户端的连接请求 建立连接以后向客户端发送当前的 系统时间 先运行服务器端程序 下面截图显示了服务器端程序运行的状况 然后运行客户端程序 客户端首先发送连接请求到服务器端 服务器端回 应后发送当前时间到客户端 这是客户端程序的截图 发送完成后 服务器端继续等待下一次连接 通过这个例子我们可以了解 TcpClient 类的基本用法 要使用这个类 必 须使用 System Net Socket 命名空间 本例用到的三个命名空间如下 using System using System Net Sockets using System Text 从字节数组中获取字符串时使用该 命名空间中的类 首先讨论一下客户端程序 开始我们必须初始化一个 TcpClient 类的实例 TcpClient client new TcpClient hostName portNum 然后使用 TcpClient 类的 GetStream 方法获取数据流 并且用它初始化一个 NetworkStream 类的实例 NetworkStream ns client GetStream 注意 当使用主机名和端口号初始化 TcpClient 类的实例时 直到跟服务 器建立了连接 这个实例才算真正建立 程序才能往下执行 如果因为网络不 通 服务器不存在 服务器端口未开放等等原因而不能连接 程序将抛出异常 并且中断执行 建立数据流之后 我们可以使用 NetworkStream 类的 Read 方法从流中 读取数据 使用 Write 方法向流中写入数据 读取数据时 首先应该建立 一个缓冲区 具体的说 就是建立一个 byte 型的数组用来存放从流中读取的数 据 Read 方法的原型描述如下 public override int Read in byte buffer int offset int size buffer 是缓冲数组 offset 是数据 字节流 在缓冲数组中存放的开始位 置 size 是读取的字节数目 返回值是读取的字节数 在本例中 简单地使用 该方法来读取服务器反馈的信息 byte bytes new byte 1024 建立缓冲区 int bytesRead ns Read bytes 0 bytes Length 读取字节流 然后显示到屏幕上 Console WriteLine Encoding ASCII GetString bytes 0 byte sRead 最后不要忘记关闭连接 client Close 下面是本例完整的程序清单 using System using System Net Sockets using System Text namespace TcpClientExample public class TcpTimeClient private const int portNum 13 服务器端口 可以随意修改 private const string hostName 127 0 0 1 服务器地址 127 0 0 1 指本机 STAThread static void Main string args try Console Write Try to connect to hostName portNum ToString r n TcpClient client new TcpClient hostName portNum NetworkStream ns client GetStream byte bytes new byte 1024 int bytesRead ns Read bytes 0 bytes Length Console WriteLine Encoding ASCII GetString bytes 0 byte sRead client Close Console ReadLine 由于是控制台程 序 故为了清楚的看到结果 可以加上这句 catch Exception e Console WriteLine e ToString 上面这个例子清晰地演示了客户端程序的编写要点 下面我们讨论一下如 何建立服务器程序 这个例子将使用 TcpListener 类 在 13 号端口监听 一旦 有客户端连接 将立即向客户端发送当前服务器的时间信息 TcpListener 的关键在于 AcceptTcpClient 方法 该方法将检测端口是 否有未处理的连接请求 如果有未处理的连接请求 该方法将使服务器同客户 端建立连接 并且返回一个 TcpClient 对象 通过这个对象的 GetStream 方法 建立同客户端通讯的数据流 事实上 TcpListener 类还提供一个更为灵活的 方法 AcceptSocket 当然灵活的代价是复杂 对于比较简单的程序 AcceptTcpClient 已经足够用了 此外 TcpListener 类提供 Start 方 法开始监听 提供 Stop 方法停止监听 首先我们使用端口初始化一个 TcpListener 实例 并且开始在 13 端口监听 private const int portNum 13 TcpListener listener new TcpListener portNum listener Start 开始监听 如果有未处理的连接请求 使用 AcceptTcpClient 方法 进行处理 并且获取数据流 TcpClient client listener AcceptTcpClient NetworkStream ns client GetStream 然后 获取本机时间 并保存在字节数组中 使用 NetworkStream Write 方法写入数据流 然后客户端就可以通 过 Read 方法从数据流中获取这段信息 byte byteTime Encoding ASCII GetBytes DateTime Now ToString ns Write byteTime 0 byteTime Length ns Close 不要忘记关闭数据流和连接 client Close 服务器端程序完整的程序清单如下 using System using System Net Sockets using System Text namespace TimeServer class TimeServer private const int portNum 13 STAThread static void Main string args bool done false TcpListener listener new TcpListener portNum listener Start while done Console Write Waiting for connection TcpClient client listener AcceptTcpClient Console WriteLine Connection accepted NetworkStream ns client GetStream byte byteTime Encoding ASCII GetBytes DateTime Now ToString try ns Write byteTime 0 byteTime Length n

温馨提示

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

评论

0/150

提交评论