TcpClient,TcpListener实现简单通讯

简介: 1、TcpListener类 从 TCP 网络客户端侦听连接。 TcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求。可使用 TcpClient 或 Socket 来连接 TcpListener。

1、TcpListener类

从 TCP 网络客户端侦听连接。

TcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求。可使用 TcpClientSocket 来连接 TcpListener。可使用 IPEndPoint、本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener。可以将本地 IP 地址指定为 Any,将本地端口号指定为 0(如果希望基础服务提供程序为您分配这些值)。如果您选择这样做,可在连接套接字后使用 LocalEndpoint 属性来标识已指定的信息。

Start 方法用来开始侦听传入的连接请求。Start 将对传入连接进行排队,直至您调用 Stop 方法或它已经完成 MaxConnections 排队为止。可使用 AcceptSocketAcceptTcpClient 从传入连接请求队列提取连接。这两种方法将阻止。如果要避免阻止,可首先使用 Pending 方法来确定队列中是否有可用的连接请求。

调用 Stop 方法来关闭 TcpListener。

 

2、TcpClient类

为 TCP 网络服务提供客户端连接。

TcpClient 类提供了一些简单的方法,用于在同步阻止模式下通过网络来连接、发送和接收流数据。

为使 TcpClient 连接并交换数据,使用 TCP ProtocolType 创建的 TcpListenerSocket 必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接到该侦听器:

    • 创建一个 TcpClient,并调用三个可用的 Connect 方法之一。

    • 使用远程主机的主机名和端口号创建 TcpClient。此构造函数将自动尝试一个连接。

注意:

如果要在同步阻止模式下发送无连接数据报,请使用 UdpClient 类。

 

 

image

图1 基本代码执行结构

 

3、源代码

(1)服务器端代码


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Net;
  7. using System.Net.Sockets;

  8. namespace TcpListenerDemo
  9. {
  10.     class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             TcpListener server = null;
  15.             try
  16.             {
  17.                 /* Set the TcpListener (Server) on port 13000. */
  18.                 Int32 port = 13000;
  19.                 IPAddress localAddr = IPAddress.Parse("127.0.0.1");

  20.                 /* TcpListener server = new TcpListener(port); -----The old API */
  21.                 server = new TcpListener(localAddr, port);

  22.                 /* Start listening for client requests. */
  23.                 server.Start();

  24.                 /* Buffer for reading data */
  25.                 Byte[] bytes = new Byte[256];
  26.                 String data = null;

  27.                 /* Enter the listening loop. */
  28.                 while (true)
  29.                 {
  30.                     Console.Write("I'm Server,Waiting for a connection... ");

  31.                     /*
  32.                     * AcceptTcpClient是一个阻塞型方法,返回用于发送、接收数据的Tcpclient实例。
  33.                     * You could also user server.AcceptSocket() here.
  34.                      */
  35.                     TcpClient client = server.AcceptTcpClient();
  36.                     Console.WriteLine("Connected!");

  37.                     data = null;

  38.                     /* 获取一个stream对象来做reading和writing操作 */
  39.                     NetworkStream stream = client.GetStream();

  40.                     int i;

  41.                     /* Loop to receive all the data sent by the client. */
  42.                     while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
  43.                     {
  44.                         /* Translate data bytes to a ASCII string. */
  45.                         data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
  46.                         Console.WriteLine("Received From Client: {0}\n", data);

  47.                         /* Process the data sent by the client. */
  48.                         data = data.ToUpper();

  49.                         byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);

  50.                         /* Send back a response. */
  51.                         stream.Write(msg, 0, msg.Length);
  52.                         Console.WriteLine("Server Sent Back: {0} Server\n", data);
  53.                     }

  54.                     /* Shutdown and end connection */
  55.                     client.Close();
  56.                 }
  57.             }
  58.             catch (SocketException e)
  59.             {
  60.                 Console.WriteLine("SocketException: {0}", e);
  61.             }
  62.             finally
  63.             {
  64.                 /* Stop listening for new clients. */
  65.                 server.Stop();
  66.             }

  67.             Console.WriteLine("\nHit enter to continue...");
  68.             Console.Read();
  69.         }
  70.     }
  71. }

 

(2)客户端代码


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Net;
  7. using System.Net.Sockets;

  8. namespace TcpClientDemo
  9. {
  10.     class Program
  11.     {
  12.         static void Connect(String server, String message)
  13.         {
  14.             try
  15.             {
  16.                 /*
  17.                  * Create a TcpClient.
  18.                  * Note, for this client to work you need to have a TcpServer
  19.                  * connected to the same address as specified by the server, port
  20.                  * combination.
  21.                  */
  22.                 Int32 port = 13000;
  23.                 TcpClient client = new TcpClient(server, port);

  24.                 /* Translate the passed message into ASCII and store it as a Byte array. */
  25.                 Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);

  26.                 // Get a client stream for reading and writing.
  27.                 // Stream stream = client.GetStream();

  28.                 NetworkStream stream = client.GetStream();

  29.                 /* Send the message to the connected TcpServer. */
  30.                 stream.Write(data, 0, data.Length);

  31.                 Console.WriteLine("Sent: {0}", message);

  32.                 // Receive the TcpServer.response.

  33.                 /* Buffer to store the response bytes. */
  34.                 data = new Byte[256];

  35.                 /* String to store the response ASCII representation. */
  36.                 String responseData = String.Empty;

  37.                 /* Read the first batch of the TcpServer response bytes. */
  38.                 Int32 bytes = stream.Read(data, 0, data.Length);
  39.                 responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
  40.                 Console.WriteLine("Received from Server: {0}", responseData);

  41.                 /* Close everything. */
  42.                 stream.Close();
  43.                 client.Close();
  44.             }
  45.             catch (ArgumentNullException e)
  46.             {
  47.                 Console.WriteLine("ArgumentNullException: {0}", e);
  48.             }
  49.             catch (SocketException e)
  50.             {
  51.                 Console.WriteLine("SocketException: {0}", e);
  52.             }

  53.             Console.WriteLine("\n Press Enter to continue...");
  54.             Console.Read();
  55.         }

  56.         static void Main(string[] args)
  57.         {
  58.             while (true)
  59.             {
  60.                 Connect("127.0.0.1", "This is send from client");
  61.             }
  62.         }
  63.     }
  64. }

 

4、 执行过程

 

image

                                         图4-1 服务器启动

 

image

                                         图4-2 客户端启动

 

image

                                         图4-3 服务器接收到客户端请求

 

 

image

                                         图4-4 双方互发

 

5、工程源码及相关附件


 TcpClientDemo.rar   

 TcpListenerDemo.rar   

 看CSharp tcp通讯类mindmap.rar   




相关文章
|
网络协议 Windows
59【工控通信】ModbusTCP通讯之ModbusPoll客户端工具配置
【工控通信】ModbusTCP通讯之ModbusPoll客户端工具配置
314 0
|
5月前
|
供应链 自动驾驶 物联网
5G通信
7月更文挑战第2天
|
6月前
|
网络协议
技术笔记:modbus通讯协议详解
技术笔记:modbus通讯协议详解
231 0
|
7月前
A-B 通信模块如何与串行设备通信?
A-B 通信模块如何与串行设备通信?
|
网络协议
通信模型与通信中的问题
通信模型 通信 信源 信源编码 信道 信宿 信源编码
209 0
通信模型与通信中的问题
|
存储 域名解析 网络协议
LinuxUDP通讯
学习网络通讯时最主要的一个内容就是UDP通讯
133 0
|
存储 Java 芯片
终于有人将TWI(串行通讯接口)给讲通了!
终于有人将TWI(串行通讯接口)给讲通了!
终于有人将TWI(串行通讯接口)给讲通了!
|
存储 算法 C语言
基于51单片机的通讯聊天系统(下)
基于51单片机的通讯聊天系统(下)
基于51单片机的通讯聊天系统(下)
|
算法 C语言
基于51单片机的通讯聊天系统(上)
基于51单片机的通讯聊天系统
基于51单片机的通讯聊天系统(上)
|
传感器 存储 编解码
通信专业英语精练
通信专业英语精练
162 0
通信专业英语精练

热门文章

最新文章