• Anabasis
    了解作者
  • C#
    开发工具
  • 3KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 81
    下载次数
  • 2005-09-21 03:31
    上传日期
本文介绍了C#中如何使用System.Net.Socket来进行基于TCP协议的通信编程,该文是以读取服务器系统时间这么一个简单例子来说明的。
用CSharp实现基于TCP协议的网络通讯.rar
  • www.pudn.com.txt
    218B
  • 用CSharp实现基于TCP协议的网络通讯.txt
    8.1KB
内容介绍
用C#实现基于TCP协议的网络通讯 TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程。然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸的是在.net framework环境下,我们不必要去追究TCP协议底层的实现,一样可以很方便的编写出基于TCP协议进行网络通讯的程序。      要进行基于TCP协议的网络通讯,首先必须建立同远程主机的连接,连接地址通常包括两部分——主机名和端口,如www.yesky.com:80中,www.yesky.com就是主机名,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,bytesRead));;      最后不要忘记关闭连接:      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,bytesRead));;      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);;   ns.Close();;   client.Close();;   }   catch (Exception e)   {   Console.WriteLine(e.ToStri
评论
    相关推荐
    • C# 网络tcp编程最佳案例
      CSharp 通过TcpClient,TcpListener实现网络通讯TcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求。TcpClient 类提供了一些简单的方法,用于在同步阻止模式下通过网络来连接、发送和...
    • C# 网络通讯(使用TCPListener)
      这是一个用C#完成的有关网络通讯的程序,有些不足,请大家包涵。使用时,先开启Scoket,再输入服务器地址,在本程序中服务器地址为192.168.1.18,端口号为:8000.用户名一定要输入,否则会出现问题。
    • C# tcp socket通讯
      C# Socket通讯
    • C#简单同步socket网络通讯
      C#编写的简单的网络调试助手,使用TcpClient,TcpListener,UdpClient类。
    • C# TCP网络通讯示例
      C# TCP网络通讯示例 线程 异步,简单易学的例子
    • C#TCP网络通讯
      TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的...本程序基于TCP编程,多线程、监听服务、Socket套接字,实现网络通讯聊天。 VS2010环境测试通过,希望对你学习帮助有用。
    • C#TCP通讯 服务器客户端
      C#实现TCP socket 通讯,含客户端和服务器源码,下载后运行可查看效果
    • C# TCP助手异步通讯
      C# 使用TCP助手类(TcpListener和TcpClient)的异步通讯例程,服务器端和客户端收发信息。
    • C# 网络编程之socket tcp 通讯demo样例
      本人通过网络搜索,搜索到的一个感觉蛮不错的socket通讯demo示例。希望对想学习C#网络编程的朋友有所帮助! 对于想开发网络通讯程序的朋友具有不错的参考价值!
    • ModBus Tcp 通讯C# +Demo
      C# ModBus Tcp读写数据 与服务器进行通讯,内包含客户端和服务端源码。