1. Visual C#TCP协议编程
  2. Visual C# TCP协议编程基础
    1. TCP协议层次结构
    2. TCP协议规范
  3. TCP协议相关类简介
    1. TcpListener
    2. TcpClient
    3. NetworkStream
Visual C# TCP协议编程基础
TCP协议层次结构
OSI七层模型:在计算机网络产生之初,每个计算机厂商都有一套自己的网络体系结构的概念,它们之间互不相容。由于不同的局域网有不同的网络协议,不同的传输介质也各有其电气性能,为了使不同的网络能够互连,必须建立统一的网络互连协议。为此,ISO(国际标准化组织)提出了网络互连协议的基本框架,称为开放系统互连(OSI)参考模型,只要遵循OSI标准,一个系统可以和位于世界上任何地方的、也遵循OSI标准的其他任何系统进行连接.现在此模型已成为计算机间和网络间进行通信的主要结构模型。目前使用的大多数网络通信协议的结构都是基于 OSI 模型的。
OSI将通信过程定义为七层,即将连网计算机间传输信息的任务划分为七个更小、更易于处理的任务组。每一个任务或任务组则被分配到各个 OSI 层。每一层都是独立存在的,因此分配到各层的任务能够独立地执行。这样使得变更其中某层提供的方案时不影响其他层。OSI参考模型分为7层,分别是物理层(Physical Layer),数据链路层(Data Link Layer),网络层(Network Layer),传输层(Transport Layer),会话层(Session Layer),表示层(Presentation Layer)和应用层(Application Layer)
TCP/IP模型:ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。如下图所示,是TCP/IP参考模型和OSI参考模型的对比示意图。
TCP/IP协议栈是美国国防部高级研究计划局计算机网(Advanced Research Projects Agency NetworkARPANET)和其后继因特网使用的参考模型。TCP/IP参考模型分为四个层次:应用层、传输层、网络互连层和主机到网络层。如下图所示。
TCP协议相关类的简介
TCP协议编程中,经常使用的类有TcpListener类,TcpClient类,NetworkStream类。
TcpListener类:
TcpListener 类从 TCP 网络客户端侦听连接。TcpListener 类提供一些简单方法,用于在阻塞同步模式下侦听和接受传入连接请求。可使用 TcpClient Socket 来连接 TcpListener。可使用 IPEndPoint、本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener。可以将本地 IP 地址指定为 Any,将本地端口号指定为 0(如果希望基础服务提供程序为您分配这些值)。如果选择这样做,可使用 LocalEndpoint 来标识已指定的信息。
Start 方法用来开始侦听传入的连接请求。Start 将对传入连接进行排队,直至您调用 Stop 方法或它已经完成 MaxConnections 排队为止。可使用 AcceptSocket AcceptTcpClient 从传入连接请求队列提取连接。这两种方法将阻塞。如果要避免阻塞,可首先使用 Pending 方法来确定队列中是否有可用的连接请求。调用 Stop 方法来关闭 TcpListener
注意:Stop 方法不会关闭任何已接受的连接。需要用户负责分别关闭这些连接
初始化 TcpListener 类的新实例。
开始侦听传入的连接请求。
接受挂起的连接请求。
接受挂起的连接请求。
关闭侦听器。
TcpClient:
TCP 网络服务提供客户端连接。TcpClient 类提供了一些简单的方法,用于在同步阻塞模式下通过网络来连接、发送和接收流数据。
为使 TcpClient 连接并交换数据,使用 TCP ProtocolType 创建的 TcpListener Socket 必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接到该侦听器:
  • 创建一个 TcpClient,并调用三个可用的 Connect 方法之一。
  • 使用远程主机的主机名和端口号创建 TcpClient。此构造函数将自动尝试一个连接。
公共构造函数
已重载。初始化 TcpClient 类的新实例。
公共属性
获取或设置有关套接字逗留时间的信息。
获取或设置一个值,该值在发送或接收缓冲区未满时禁用延迟。
获取或设置接收缓冲区的大小。
获取或设置在初始化一个读取操作以后 TcpClient 等待接收数据的时间量。
获取或设置发送缓冲区的大小。
获取或设置 TcpClient 等待发送操作成功完成的时间量。
公共方法
关闭 TCP 连接并释放与 TcpClient 关联的所有资源。
已重载。使用指定的主机名和端口号将客户端连接到 TCP 主机。
返回用于发送和接收数据的 NetworkStream
NetworkStream类:
提供用于网络访问的基础数据流。 NetworkStream 类提供在阻塞模式下通过 Stream 套接字发送和接收数据的方法。您可以使用 NetworkStream 类进行同步和异步数据传输。要创建 NetworkStream,必须提供连接的 Socket。也可指定 NetworkStream 对所提供的 Socket 具有哪些 FileAccess 权限。默认情况下,关闭 NetworkStream 并不会关闭所提供的 Socket。如果要使 NetworkStream 拥有关闭所提供的 Socket 的权限,则必须将 ownsSocket 构造函数参数的值指定为 true
Write Read 方法用于简单的单线程同步阻塞 I/O。若要使用不同的线程来处理 I/O,则请考虑使用 BeginWrite/ EndWrite BeginRead/ EndRead 方法进行通信。
NetworkStream 不支持对网络数据流的随机访问。CanSeek 属性用于指示流是否支持查找,它的值始终为 false。读取 Position 属性、读取 Length 属性或者调用 Seek 方法都会引发 NotSupportedException
公共构造函数
已重载。创建 NetworkStream 类的新实例。
公共属性
已重写。获取一个值,该值指示 NetworkStream 是否支持读取。
已重写。获取一个值,该值指示流是否支持查找。该属性总是返回 false
已重写。获取一个值,该值指示 NetworkStream 是否支持写入。
获取一个值,该值指示在要读取的 NetworkStream 上是否有可用的数据。
已重写。获取流上可用数据的长度。此属性始终引发 NotSupportedException
已重写。获取或设置流中的当前位置。此属性始终引发 NotSupportedException
公共方法
已重写。从 NetworkStream 开始异步读取。
已重写。开始向流异步写入。
已重写。关闭 NetworkStream
已重写。处理异步读取的结束。
已重写。处理异步写入的结束。
已重写。刷新流中的数据。保留此方法供将来使用。
已重写。从 NetworkStream 读取数据。
ReadByte(从 Stream 继承)
从流中读取一个字节,并将流内的位置向前推进一个字节,或者如果已到达流的末尾,则返回 -1
已重写。将流的当前位置设置为给定值。此方法始终引发 NotSupportedException
已重写。将数据写入 NetworkStream
WriteByte(从 Stream 继承)
将一个字节写入流内的当前位置,并将流内的位置向前推进一个字节