知识大全 用C#实现基于TCP协议的网络通讯

Posted

篇首语:人要心强,树要皮硬。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用C#实现基于TCP协议的网络通讯相关的知识,希望对你有一定的参考价值。

用C#实现基于TCP协议的网络通讯  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

TCP协议是一个基本的网络协议 基本上所有的网络服务都是基于TCP协议的 如HTTP FTP等等 所以要了解网络编程就必须了解基于TCP协议的编程 然而TCP协议是一个庞杂的体系 要彻底的弄清楚它的实现不是一天两天的功夫 所幸的是在 net framework环境下 我们不必要去追究TCP协议底层的实现 一样可以很方便的编写出基于TCP协议进行网络通讯的程序    要进行基于TCP协议的网络通讯 首先必须建立同远程主机的连接 连接地址通常包括两部分——主机名和端口 如 中 就是主机名 指主机的 端口 当然 主机名也可以用IP地址代替 当连接建立之后 就可以使用这个连接去发送和接收数据包 TCP协议的作用就是保证这些数据包能到达终点并且能按照正确的顺序组装起来    在 net framework的类库(Class Library)中 提供了两个用于TCP网络通讯的类 分别是TcpClient和TcpListener 由其英文意义显而易见 TcpClient 类是基于TCP协议的客户端类 而TcpListener是服务器端 监听(Listen)客户端传来的连接请求 TcpClient类通过TCP协议与服务器进行通讯并获取信息 它的内部封装了一个Socket类的实例 这个Socket对象被用来使用TCP协议向服务器请求和获取数据 因为与远程主机的交互是以数据流的形式出现的 所以传输的数据可以使用 net framework中流处理技术读写 在我们下边的例子中 你可以看到使用NeorkStream类操作数据流的方法    在下面的例子中 我们将建立一个时间服务器 包括服务器端程序和客户端程序 服务器端监听客户端的连接请求 建立连接以后向客户端发送当前的系统时间    先运行服务器端程序 下面截图显示了服务器端程序运行的状况    然后运行客户端程序 客户端首先发送连接请求到服务器端 服务器端回应后发送当前时间到客户端 这是客户端程序的截图    发送完成后 服务器端继续等待下一次连接    通过这个例子我们可以了解TcpClient类的基本用法 要使用这个类 必须使用System Net Socket命名空间 本例用到的三个命名空间如下    

  using System;  using System Net Sockets;  using System Text;//从字节数组中获取字符串时使用该命名空间中的类  //首先讨论一下客户端程序 开始我们必须初始化一个TcpClient类的实例

  TcpClient client = new TcpClient(hostName portNum);  //然后使用TcpClient类的GetStream()方法获取数据流 并且用它初始化一个NeorkStream类的实例

  NeorkStream ns = client GetStream();

   注意 当使用主机名和端口号初始化TcpClient类的实例时 直到跟服务器建立了连接 这个实例才算真正建立 程序才能往下执行 如果因为网络不通 服务器不存在 服务器端口未开放等等原因而不能连接 程序将抛出异常并且中断执行    建立数据流之后 我们可以使用NeorkStream类的Read()方法从流中读取数据 使用Write()方法向流中写入数据 读取数据时 首先应该建立一个缓冲区 具体的说 就是建立一个byte型的数组用来存放从流中读取的数据 Read()方法的原型描述如下    public override int Read(in byte[] buffer int offset int size)   buffer是缓冲数组 offset是数据(字节流)在缓冲数组中存放的开始位置 size是读取的字节数目 返回值是读取的字节数 在本例中 简单地使用该方法来读取服务器反馈的信息    

  byte[] bytes = new byte[ ];//建立缓冲区  int bytesRead = ns Read(bytes bytes Length);//读取字节流 // 然后显示到屏幕上

  Console WriteLine(Encoding ASCII GetString(bytes bytesRead));  //最后不要忘记关闭连接

  client Close();

  下面是本例完整的程序清单    

  

  using System;  using System Net Sockets;  using System Text;  namespace TcpClientExample      public class TcpTimeClient          private const int portNum = ;//服务器端口 可以随意修改      private const string hostName = ;//服务器地址 指本机

  [STAThread]      static void Main(string[] args)              try                  Console Write( Try to connect to +hostName+ : +portNum ToString()+ \\r\\n );          TcpClient client = new TcpClient(hostName portNum);          NeorkStream ns = client GetStream();          byte[] bytes = new byte[ ];          int bytesRead = ns Read(bytes bytes Length);          Console WriteLine(Encoding ASCII GetString(bytes bytesRead));          client Close();          Console ReadLine();//由于是控制台程序 故为了清楚的看到结果 可以加上这句

          catch (Exception e)                  Console WriteLine(e ToString());                    

  上面这个例子清晰地演示了客户端程序的编写要点 下面我们讨论一下如何建立服务器程序 这个例子将使用TcpListener类 在 号端口监听 一旦有客户端连接 将立即向客户端发送当前服务器的时间信息    TcpListener的关键在于AcceptTcpClient()方法 该方法将检测端口是否有未处理的连接请求 如果有未处理的连接请求 该方法将使服务器同客户端建立连接 并且返回一个TcpClient对象 通过这个对象的GetStream方法建立同客户端通讯的数据流 事实上 TcpListener类还提供一个更为灵活的方法AcceptSocket() 当然灵活的代价是复杂 对于比较简单的程序 AcceptTcpClient()已经足够用了 此外 TcpListener类提供Start()方法开始监听 提供Stop()方法停止监听    首先我们使用端口初始化一个TcpListener实例 并且开始在 端口监听    

  

  private const int portNum = ;  TcpListener listener = new TcpListener(portNum);  listener Start();//开始监听  //如果有未处理的连接请求 使用AcceptTcpClient方法进行处理 并且获取数据流

  TcpClient client = listener AcceptTcpClient();  NeorkStream ns = client GetStream();  //然后 获取本机时间 并保存在字节数组中 使用NeorkStream Write()方法写入数据流 然后客户端就可以通过Read()方法从数据流中获取这段信息

  byte[] byteTime = Encoding ASCII GetBytes(DateTime Now ToString());  ns Write(byteTime byteTime Length);  ns Close();//不要忘记关闭数据流和连接  client Close();

cha138/Article/program/net/201311/12305

相关参考

知识大全 Java网络协议 TCP和客户端/服务器范型

Java网络协议TCP和客户端/服务器范型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在网络

知识大全 ASP.NET基于TCP的网络通信程序演示

ASP.NET基于TCP的网络通信程序演示  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本程序

知识大全 Java实现基于http协议的网络文件下载

Java实现基于http协议的网络文件下载  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  HTT

知识大全 使用TCP/IP协议实现聊天程序

使用TCP/IP协议实现聊天程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  TCP/IP协议

知识大全 Visual Basic.Net实现TCP协议

VisualBasic.Net实现TCP协议  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!TCP协

知识大全 用C#实现飞信协议

用C#实现飞信协议  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  目前已经有C#版得飞信sdk功

知识大全 华为面试题

 华为的面试试题比较专业,都是一些专业知道。Q1:请你分别划划OSI的七层网络结构图,和TCP/IP的五层结构图?Q2:请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用?TCP

知识大全 用C#实现HTTP协议下的多线程文件传输

用C#实现HTTP协议下的多线程文件传输  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  很多人都

在Internet上用于收发电子邮件的协议是

在Internet上用于收发电子邮件的协议是_____。A、TCP/IPB、NETBEUIC、IPX/SPXD、P0P3/SMTP答案:D解析:OP(PostOfficeProtocol)邮局通讯协定

Internet的通信协议是__协议

Internet的通信协议是_____协议。A、IPSB、TCP/IPC、WLAND、NetBEUI答案:B解析:zlntemet中的通信协议是TCP/IP协议。