网络协议基本概念-TCP通信代码案例

打印 上一主题 下一主题

主题 1885|帖子 1885|积分 5655

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
特性TCPUDP面向连接无连接可靠(确保数据完整、按顺序到达)不可靠(数据可能丢失、无序)较慢(有连接和确认开销)较快(无连接和确认开销)字节省(无界限)数据报(有明确界限)文件传输、网页浏览、邮件传输等实时通信、在线游戏、DNS 查询等通俗的表明

  • TCP:你打电话给朋侪,先拨号创建连接,通话结束后挂断。通话过程中,如果对方没听到某句话,你可以重复说。
  • UDP:你给朋侪寄了一封明信片,不需要先打电话,直接寄出。明信片可能丢失,也可能迟到,但你不会知道。
下面给出一个底子的TCP通信代码案例

服务端代码

服务端代码的作用是监听客户端的连接哀求,并与客户端进行通信。
完整代码
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. class Server
  6. {
  7.     static void Main()
  8.     {
  9.         // 创建一个 TcpListener 对象,监听指定的 IP 地址和端口
  10.         TcpListener listener = new TcpListener(IPAddress.Any, 8080);
  11.         
  12.         // 开始监听
  13.         listener.Start();
  14.         Console.WriteLine("Server started. Waiting for connection...");
  15.         try
  16.         {
  17.             // 等待客户端连接
  18.             TcpClient client = listener.AcceptTcpClient();
  19.             Console.WriteLine("Client connected.");
  20.             // 获取网络流,用于读写数据
  21.             NetworkStream stream = client.GetStream();
  22.             // 接收客户端发送的消息
  23.             byte[] buffer = new byte[1024];
  24.             int bytesRead = stream.Read(buffer, 0, buffer.Length);
  25.             string message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
  26.             Console.WriteLine("Received from client: " + message);
  27.             // 向客户端发送响应
  28.             byte[] response = Encoding.ASCII.GetBytes("Hello from server!");
  29.             stream.Write(response, 0, response.Length);
  30.             Console.WriteLine("Response sent to client.");
  31.         }
  32.         catch (Exception ex)
  33.         {
  34.             // 捕获异常并输出错误信息
  35.             Console.WriteLine("Error: " + ex.Message);
  36.         }
  37.         finally
  38.         {
  39.             // 关闭客户端连接和监听器
  40.             listener.Stop();
  41.         }
  42.         Console.WriteLine("Press any key to exit...");
  43.         Console.ReadKey();
  44.     }
  45. }
复制代码
代码解析


  • 创建 TcpListener 对象
    1. TcpListener listener = new TcpListener(IPAddress.Any, 8080);
    复制代码

    • TcpListener 是服务端的核心类,用于监听客户端的连接哀求。
    • IPAddress.Any 表示监听所有网络接口上的连接。
    • 8080 是监听的端口号。

  • 开始监听
    1. listener.Start();
    2. Console.WriteLine("Server started. Waiting for connection...");
    复制代码

    • Start() 方法启动监听器,开始等候客户端连接。
    • 此时服务端会输出 "Server started. Waiting for connection..."。

  • 等候客户端连接
    1. TcpClient client = listener.AcceptTcpClient();
    复制代码

    • AcceptTcpClient() 方法会阻塞,直到有客户端连接到服务端。
    • 连接乐成后,返回一个 TcpClient 对象,表示与客户端的连接。

  • 获取网络流
    1. NetworkStream stream = client.GetStream();
    复制代码

    • GetStream() 方法返回一个 NetworkStream 对象,用于在连接中读写数据。

  • 接收客户端消息
    1. byte[] buffer = new byte[1024];
    2. int bytesRead = stream.Read(buffer, 0, buffer.Length);
    3. string message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
    复制代码

    • Read() 方法从网络流中读取数据,返回现实读取的字节数。
    • Encoding.ASCII.GetString() 将字节数组转换为字符串。
    • 服务端会输出 "Received from client: " + 消息内容。

  • 向客户端发送响应
    1. byte[] response = Encoding.ASCII.GetBytes("Hello from server!");
    2. stream.Write(response, 0, response.Length);
    复制代码

    • Encoding.ASCII.GetBytes() 将字符串转换为字节数组。
    • Write() 方法将字节数组写入网络流,发送给客户端。

  • 非常处理
    1. catch (Exception ex)
    2. {
    3.     Console.WriteLine("Error: " + ex.Message);
    4. }
    复制代码

    • 捕获非常并输堕落误信息,方便调试。

  • 关闭连接和监听器
    1. finally
    2. {
    3.     listener.Stop();
    4. }
    复制代码

    • Stop() 方法停止监听器,关闭所有连接。

  • 等候用户输入
    1. Console.WriteLine("Press any key to exit...");
    2. Console.ReadKey();
    复制代码

    • 防止程序运行后立刻退出,方便查看输出结果。

客户端代码

客户端代码的作用是连接到服务端,并与服务端进行通信。
完整代码
  1. using System;
  2. using System.Net.Sockets;
  3. using System.Text;
  4. class Client
  5. {
  6.     static void Main()
  7.     {
  8.         // 创建一个 TcpClient 对象,用于连接到服务端
  9.         TcpClient client = new TcpClient();
  10.         
  11.         try
  12.         {
  13.             // 连接到服务端
  14.             client.Connect("127.0.0.1", 8080);
  15.             Console.WriteLine("Connected to server.");
  16.             // 获取网络流,用于读写数据
  17.             NetworkStream stream = client.GetStream();
  18.             // 向服务端发送消息
  19.             byte[] message = Encoding.ASCII.GetBytes("Hello from client!");
  20.             stream.Write(message, 0, message.Length);
  21.             Console.WriteLine("Message sent to server.");
  22.             // 接收服务端的响应
  23.             byte[] buffer = new byte[1024];
  24.             int bytesRead = stream.Read(buffer, 0, buffer.Length);
  25.             string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
  26.             Console.WriteLine("Received from server: " + response);
  27.         }
  28.         catch (Exception ex)
  29.         {
  30.             // 捕获异常并输出错误信息
  31.             Console.WriteLine("Error: " + ex.Message);
  32.         }
  33.         finally
  34.         {
  35.             // 关闭客户端连接
  36.             client.Close();
  37.         }
  38.         Console.WriteLine("Press any key to exit...");
  39.         Console.ReadKey();
  40.     }
  41. }
复制代码
代码解析


  • 创建 TcpClient 对象
    1. TcpClient client = new TcpClient();
    复制代码

    • TcpClient 是客户端的核心类,用于连接到服务端。

  • 连接到服务端
    1. client.Connect("127.0.0.1", 8080);
    复制代码

    • Connect() 方法用于连接到指定的 IP 地点和端口。
    • 127.0.0.1 是本地回环地点,表示连接到本地服务端。
    • 8080 是服务端监听的端口号。

  • 获取网络流
    1. NetworkStream stream = client.GetStream();
    复制代码

    • GetStream() 方法返回一个 NetworkStream 对象,用于在连接中读写数据。

  • 向服务端发送消息
    1. byte[] message = Encoding.ASCII.GetBytes("Hello from client!");
    2. stream.Write(message, 0, message.Length);
    复制代码

    • Encoding.ASCII.GetBytes() 将字符串转换为字节数组。
    • Write() 方法将字节数组写入网络流,发送给服务端。

  • 接收服务端响应
    1. byte[] buffer = new byte[1024];
    2. int bytesRead = stream.Read(buffer, 0, buffer.Length);
    3. string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
    复制代码

    • Read() 方法从网络流中读取数据,返回现实读取的字节数。
    • Encoding.ASCII.GetString() 将字节数组转换为字符串。
    • 客户端会输出 "Received from server: " + 响应内容。

  • 非常处理
    1. catch (Exception ex)
    2. {
    3.     Console.WriteLine("Error: " + ex.Message);
    4. }
    复制代码

    • 捕获非常并输堕落误信息,方便调试。

  • 关闭连接
    1. finally
    2. {
    3.     client.Close();
    4. }
    复制代码

    • Close() 方法关闭客户端连接。

  • 等候用户输入
    1. Console.WriteLine("Press any key to exit...");
    2. Console.ReadKey();
    复制代码

    • 防止程序运行后立刻退出,方便查看输出结果。

运行步调


  • 先运行服务端代码

    • 服务端会输出 "Server started. Waiting for connection..."。
    • 服务端开始监听客户端连接。

  • 再运行客户端代码

    • 客户端会输出 "Connected to server."。
    • 客户端发送消息 "Hello from client!" 到服务端。
    • 服务端接收消息并输出 "Received from client: Hello from client!"。
    • 服务端发送响应 "Hello from server!"。
    • 客户端接收响应并输出 "Received from server: Hello from server!"。

  • 查看结果

    • 服务端和客户端的控制台窗口都会显示通信结果。
    • 按任意键退出程序。

总结

通过以上详细解析,你可以快速理解服务端和客户端代码的逻辑。服务端负责监听连接并处理通信,客户端负责连接到服务端并发送/接收消息。掌握这些底子后,可以进一步学习更复杂的网络编程概念,如异步通信、多线程处理等。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表