C#中Socket通信用法实例详解

C#中Socket通信用法实例详解

1. 简介

本文将详细讲解 C#中 Socket 通信的用法以及实例。Socket 是即插即用的通用数据交换接口,常用于不同操作系统、不同软件之间的通信。在 C# 中,通过 System.Net.Sockets 命名空间下的实现,可以轻松实现 Socket 通信,可以方便地实现 TCP、UDP 等协议。

2. 实例1:C#中基于TCP协议实现Socket通信

我们首先通过一个简单的示例来详细讲解如何在 C# 中基于 TCP 协议实现 Socket 通信。

以下是客户端代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Client {
    public static void Main() {
        // 创建一个 TCP/IP socket.
        Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // 连接到远程 endpoint
        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000);

        try {
            // 向服务器端发起连接请求
            clientSocket.Connect(remoteEP);

            Console.WriteLine("Socket 连接到 " + clientSocket.RemoteEndPoint.ToString());

            // 发送数据到服务器端
            byte[] msg = Encoding.ASCII.GetBytes("Hello from client");
            clientSocket.Send(msg);

            // 从服务器端接收响应
            byte[] responseMsg = new byte[1024];
            int responseSize = clientSocket.Receive(responseMsg);
            Console.WriteLine("接收到的响应: " + Encoding.ASCII.GetString(responseMsg, 0, responseSize));

            // 关闭连接
            clientSocket.Shutdown(SocketShutdown.Both);
            clientSocket.Close();
        } catch (Exception ex) {
            Console.WriteLine(ex.ToString());
        }
    }
}

以下是服务器端代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Server {
    public static void Main() {
        // 数据缓冲区
        byte[] buffer = new byte[1024];

        // 服务器监听IP地址及端口
        IPEndPoint serverIP = new IPEndPoint(IPAddress.Any, 11000);

        // 创建TCP/IP socket
        Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        try {
            // 绑定到本地端点并启动监听
            serverSocket.Bind(serverIP);
            serverSocket.Listen(10);

            Console.WriteLine("等待客户端连接...");

            // 接受客户端请求
            Socket clientSocket = serverSocket.Accept();

            Console.WriteLine("客户端连接成功:" + clientSocket.RemoteEndPoint.ToString());

            // 接收来自客户端的请求
            int size = clientSocket.Receive(buffer);
            Console.WriteLine("接收到客户端请求: " + Encoding.ASCII.GetString(buffer, 0, size));

            // 向客户端发送响应数据
            byte[] responseMsg = Encoding.ASCII.GetBytes("Hi, client!");
            clientSocket.Send(responseMsg);

            // 关闭连接
            clientSocket.Shutdown(SocketShutdown.Both);
            clientSocket.Close();
        } catch (Exception ex) {
            Console.WriteLine(ex.ToString());
        }
    }
}

运行上述代码,将会打印出类似如下的输出:

等待客户端连接...
客户端连接成功:127.0.0.1:59806
接收到客户端请求: Hello from client

3. 示例2:C#中基于UDP协议实现Socket通信

接下来,我们通过另一个示例来详细讲解如何在 C# 中基于 UDP 协议实现 Socket 通信。

以下是客户端代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Client {
    public static void Main() {
        // 创建UDP socket
        Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        // 发送数据到服务器端
        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000);
        byte[] msg = Encoding.ASCII.GetBytes("Hello from client using UDP");
        clientSocket.SendTo(msg, remoteEP);

        // 接收服务器端的响应
        EndPoint remoteAddr = new IPEndPoint(IPAddress.Any, 0);
        byte[] buffer = new byte[1024];
        int responseSize = clientSocket.ReceiveFrom(buffer, ref remoteAddr);
        Console.WriteLine("来自服务器端的响应: " + Encoding.ASCII.GetString(buffer, 0, responseSize));

        // 关闭Socket
        clientSocket.Close();
    }
}

以下是服务器端代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Server {
    public static void Main() {
        // 创建UDP socket
        Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        // 绑定服务器 IP 和端口
        IPEndPoint serverEP = new IPEndPoint(IPAddress.Any, 11000);
        serverSocket.Bind(serverEP);

        // 接收客户端的请求
        EndPoint remoteAddr = new IPEndPoint(IPAddress.Any, 0);
        byte[] buffer = new byte[1024];
        int size = serverSocket.ReceiveFrom(buffer, ref remoteAddr);
        Console.WriteLine("来自客户端的请求: " + Encoding.ASCII.GetString(buffer, 0, size));

        // 向客户端发送响应
        byte[] responseMsg = Encoding.ASCII.GetBytes("Hi, client using UDP!");
        serverSocket.SendTo(responseMsg, remoteAddr);

        // 关闭Socket
        serverSocket.Close();
    }
}

运行上述代码,将会打印出类似如下的输出:

来自客户端的请求: Hello from client using UDP

4. 结论

通过上例的讲解,我们可以得出以下结论:

  • 在 C# 中,通过 System.Net.Sockets 命名空间下的实现,可以轻松实现 Socket 通信;
  • Socket 是即插即用的通用数据交换接口,常用于不同操作系统、不同软件之间的通信;
  • 可以使用 TCP、UDP 等协议实现 Socket 通信;
  • 在实现 Socket 通信时,需要特别注意数据包大小和传输协议等因素。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中Socket通信用法实例详解 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 各种AJAX方法的使用比较详解

    AJAX(Asynchronous JavaScript and XML)是一种用于创建异步Web应用程序的技术。它可以在不刷新整个页面的情况下更新部分页面内容,提高Web应用程序的响应速度和用户体验。本文将介绍各种AJAX方法的使用,包括XMLHttpRequest、jQuery AJAX和Fetch API。 XMLHttpRequest XMLHttp…

    C# 2023年5月15日
    00
  • 一篇文章说通C#的属性Attribute

    接下来我将为您详细讲解关于“一篇文章说通C#的属性Attribute”的完整攻略,该攻略的主要内容包括以下几个方面: 一、属性Attribute概述 在C#语言中,属性Attribute通常被称为为元数据,也就是代码中的数据,可以帮助我们更好地描述和扩展代码的信息。可以理解为是一种装饰着修饰代码或者类型信息的特殊语法。 二、常见的Attribute类别 C#…

    C# 2023年5月15日
    00
  • ASP.NET MVC中使用log4net的实现示例

    下面是ASP.NET MVC中使用log4net的实现示例的完整攻略。 准备工作 首先,我们需要在ASP.NET MVC项目中安装log4net包。在Visual Studio中,可以通过NuGet Package Manager来安装: 打开Visual Studio; 打开ASP.NET MVC项目; 在Solution Explorer中右键单击项目名…

    C# 2023年5月31日
    00
  • 从零开始学习jQuery (十) jQueryUI常用功能实战

    本篇文章主题是“从零开始学习jQuery (十) jQueryUI常用功能实战”,主要涉及jQueryUI常用组件实现的教程和示例。下面将对文章内容进行详细讲解。 一、jQueryUI介绍 本文主要介绍jQueryUI,它是一个基于jQuery的UI插件库,提供了多种常用UI组件,用于构建各种Web应用程序。常用的组件包括但不限于:对话框(dialog)、日…

    C# 2023年5月31日
    00
  • C#中List和SortedList的简介

    下面我将详细介绍C#中List和SortedList的简介以及它们的区别。 List和SortedList简介 List List是C#中的一个泛型集合类,它可以按照添加的顺序存储任意类型的元素,并且可以动态地扩展大小。List有许多有用的方法,如Add添加新元素、Remove删除元素等。 SortedList SortedList是C#中的一个泛型集合类,…

    C# 2023年6月8日
    00
  • C# List集合中获取重复值及集合运算详解

    C# List集合中获取重复值及集合运算详解 在 C# 中,List 是一种常用的类型,可以实现可变大小的数组。经常遇到需要获取 List 集合中的重复值,以及对多个 List 进行集合运算的情况。本文将详细讲解如何在 C# 中实现这些操作。 获取 List 集合中的重复值 在 List 中获取重复值比较常见,一个最简单的方法是借助 Linq 进行查询。具体…

    C# 2023年6月1日
    00
  • Go语言流程控制语句

    Go语言流程控制语句 在Go语言中,流程控制是任何编程语言中都不可避免的一部分。Go语言提供了几种流程控制语句,包括if语句、for循环、switch语句、break语句、continue语句和goto语句。本文将详细介绍这些语句及其使用场景。 if语句 if语句是Go语言中最基本也是最常用的流程控制语句之一,它用于根据一个条件判断来决定是否执行某段代码。i…

    C# 2023年6月7日
    00
  • C#动态执行批处理命令的方法

    C#可以通过Process类来执行批处理命令。但是Process类只能执行已知的静态命令。为了执行动态生成的命令,可以使用ProcessStartInfo的属性以及RedirectStandardInput和UseShellExecute方法组合来实现输入指令、执行命令的效果。 下面是两个示例: 示例一: 这个示例展示了如何使用Process类执行一个可操作…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部