网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > DotNet > C# > 用C#实现基于TCP协议的网络通讯  

用C#实现基于TCP协议的网络通讯

2008-03-05  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

  TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程。然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸的是在。net framework环境下,我们不必要去追究TCP协议底层的实现,一样可以很方便的编写出基于TCP协议进行网络通讯的程序。
 
  要进行基于TCP协议的网络通讯,首先必须建立同远程主机的连接,连接地址通常包括两部分——主机名和端口,如www.yesky.com:80中, www.yesky.com就是主机名,80指主机的80端口,当然,主机名也可以用IP地址代替。当连接建立之后,就可以使用这个连接去发送和接收数据包,TCP协议的作用就是保证这些数据包能到达终点并且能按照正确的顺序组装起来。
网管联盟bitsCN_com

 
  在。net framework的类库(Class Library)中,提供了两个用于TCP网络通讯的类,分别是TcpClient和TcpListener.由其英文意义显而易见,TcpClient 类是基于TCP协议的客户端类,而TcpListener是服务器端,监听(Listen)客户端传来的连接请求。TcpClient类通过TCP协议服务器进行通讯并获取信息,它的内部封装了一个Socket类的实例,这个Socket对象被用来使用TCP协议服务器请求和获取数据。因为与远程主机的交互是以数据流的形式出现的,所以传输的数据可以使用。net framework中流处理技术读写。在我们下边的例子中,你可以看到使用NetworkStream类操作数据流的方法。
 
  在下面的例子中,我们将建立一个时间服务器,包括服务器端程序和客户端程序。服务器端监听客户端的连接请求,建立连接以后向客户端发送当前的系统时间。 网管网www.bitscn.com
 
  先运行服务器端程序,下面截图显示了服务器端程序运行的状况:
 
  然后运行客户端程序,客户端首先发送连接请求到服务器端,服务器端回应后发送当前时间到客户端,这是客户端程序的截图:
 
  发送完成后,服务器端继续等待下一次连接:
 
  通过这个例子我们可以了解TcpClient类的基本用法,要使用这个类,必须使用System.Net.Socket命名空间,本例用到的三个命名空间如下:
 
  

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

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

网管论坛bbs_bitsCN_com

  NetworkStream ns = client.GetStream();

中国网管联盟bitsCN.com

 
  注意,当使用主机名和端口号初始化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];//建立缓冲区 网管联盟bitsCN@com
  int bytesRead = ns.Read(bytes, 0, bytes.Length);//读取字节流
 // 然后显示到屏幕上: 网管网www.bitscn.com

  Console.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead));
  //最后不要忘记关闭连接: 网管联盟bitsCN@com

  client.Close(); 网管联盟bitsCN@com

 

网管下载dl.bitscn.com

中国网管论坛bbs.bitsCN.com


TAGs   协议   基于   实现   服务器   程序   连接   数据   使用   方法   客户端      
 上一篇:用C#调外部Ping命令获取网络连接情况   下一篇:C#如何把html中的相对路径变成绝对路径
用C#实现基于TCP协议的网络通讯 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: