`

用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.ToString());
  }
  }
  
  listener.Stop();
  }
  }
  }
  
  把上面两段程序分别编译运行,OK,我们已经用C#实现了基于TCP协议的网络通讯,怎么样?很简单吧!
  
  使用上面介绍的基本方法,我们可以很容易的编写出一些很有用的程序,如FTP,电子邮件收发,点对点即时通讯等等,你甚至可以自己编制一个QQ来! 
 
分享到:
评论

相关推荐

    用C#完成基于TCP协议地网络通讯

    为了更直观地理解如何使用C#实现基于TCP协议的网络通讯,下面将详细介绍一个简单的例子——时间服务器应用。该应用包含服务器端和客户端两部分。 ##### 4.1 服务器端 1. **初始化TcpListener**:创建一个 `Tcp...

    用CSharp实现基于TCP协议的网络通讯.rar_C#与Kepware通讯_C#连接kepware_c# tcp通讯_c#

    在提供的"用CSharp实现基于TCP协议的网络通讯.txt"文件中,可能包含了实现这一过程的具体代码示例和详细解释,可以参考学习。而"www.pudn.com.txt"可能是提供下载资源的网站信息,可能包含更多相关的学习资料链接。...

    c#基于TCP协议的Socket通信完整Demo(已实现多人聊天室)

    本文将深入探讨一个基于C#的TCP协议Socket通信的完整示例,它实现了多人聊天室功能。我们将详细解析这个Demo的各个方面,帮助你理解如何在C#中构建这样的系统。 首先,TCP(Transmission Control Protocol)是一种...

    C#TCP通信协议

    - TCP协议本身有流量控制和拥塞控制机制,但实际应用中可能需要进一步优化,如设置合适的缓冲区大小,合理控制发送速度等。 7. **心跳机制**: - 为了检测网络连接是否断开,可以设置心跳机制,定期发送小量数据...

    C#使用TCPIP与ModBus进行通讯,c语言实现tcp通信,C#

    本文将详细讲解如何使用C#通过TCP/IP协议与ModBus设备进行通讯,以及C#实现TCP通信的基本步骤。 首先,我们要了解什么是ModBus。ModBus是一种通用的串行通信协议,最初由Modicon公司开发,现在已经成为工业自动化...

    TCP.rar_c# tcp通讯_tcp_基于TCP协议_通讯协议 TCP

    在实际项目中,还需要考虑到错误恢复、流量控制、拥塞控制等TCP协议特性。同时,通过`www.pudn.com.txt`和`NetTime`这两个文件名,我们可以推测这个压缩包可能包含了关于网络时间同步或者其他网络相关的示例代码或...

    C#使用ModbusTcp协议与西门子1200PLC通讯

    在本文中,我们将深入探讨如何使用C#编程语言通过ModbusTcp协议与西门子1200 PLC进行通信。ModbusTcp是一种广泛应用于工业自动化领域的通信协议,它允许不同设备之间交换数据。西门子1200 PLC是西门子推出的一款小型...

    TCP用c#实现的网络通讯程序,基于客户端与服务器

    本文将深入探讨使用C#实现的TCP网络通信程序,基于客户端与服务器的架构。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,常用于确保数据的完整性和顺序。 首先,我们要了解TCP的基本原理...

    C#.NET基于TCP+UDP的通讯程序

    【标题】"C#.NET基于TCP+UDP的通讯程序"涉及了两个主要的网络通信协议——TCP(传输控制协议)和UDP(用户数据报协议),以及C#.NET编程语言的应用。在C#.NET环境中,开发这样的通讯程序可以实现本地多客户端与...

    C#基于TCP连接实例

    C#实现了基于TCP协议的网络通讯,对TCP连接有一定的学习借鉴性。

    基于C#编写的modbus tcp类库

    描述中的“基于tcp/ip通讯,使用方便”意味着这个类库设计时考虑了易用性,使得开发者可以轻松地将Modbus TCP功能集成到他们的C#应用程序中,通过TCP/IP网络连接实现设备间的通信。 在C#中,要创建这样一个Modbus ...

    C#_TCP通讯的实现方法_.net_基于C#快速实现TCP通信_

    本篇文章将详细探讨如何使用C#实现TCP通信,以帮助开发者快速理解和应用。 首先,TCP通信的基础是套接字(Socket),它是操作系统提供的网络通信接口。在C#中,我们可以通过System.Net.Sockets命名空间下的Socket类...

    C#连接ModbusTCP连接示例

    ModbusTCP是Modbus协议的网络版本,它基于TCP/IP协议栈,允许设备通过以太网进行通信。这使得远程监控和控制PLC设备成为可能。 在C#中,实现ModbusTCP连接通常需要借助第三方库,如NModbus。NModbus是一个开源的...

    C#TCP通信协议使用

    本篇文章将深入探讨如何在C#编程环境中使用TCP协议进行客户端和服务器端的通信。 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它在数据传输前会建立连接,并在传输完成后断开连接,确保了数据的完整...

    C# 实现与汇川H5U PLC Modbus-TCP通讯示例

    理解Modbus-TCP协议是至关重要的。Modbus协议基于ASCII或RTU(远程终端单元)报文格式,而Modbus-TCP则是该协议的网络版本,使用TCP/IP协议栈。它在标准的TCP连接上工作,通常使用端口502,提供了更可靠的传输和更高...

    NModbus4测试工程C#,ModbusTcp通讯

    NModbus4是一个基于C#的开源库,用于实现Modbus通信协议。这个测试工程是专为使用C#编程语言的开发者设计的,目的是帮助他们在自己的应用中集成ModbusTCP通信功能。Modbus是一种广泛应用于工业自动化领域的通信协议...

    C# Modbus TCP 源代码

    C# Modbus TCP源代码是用C#编程语言实现的,用于在基于TCP/IP的网络上实现Modbus通信。C#是一种面向对象的编程语言,非常适合开发这样的网络应用。 在C#中实现Modbus TCP,首先需要理解Modbus协议的基础。Modbus...

Global site tag (gtag.js) - Google Analytics