【C#】Socket通信的使用

发布于:2025-04-14 ⋅ 阅读:(14) ⋅ 点赞:(0)

在C#中,Socket通信是一种用于实现网络通信的底层技术。通过Socket,程序可以在网络上与其他设备进行数据交换。以下是如何使用C#中的System.Net.Sockets命名空间来实现Socket通信的详细步骤。

1. Socket通信的基本概念

  • Socket: 一个Socket是网络通信的端点,它封装了IP地址和端口号。
  • Server(服务器端): 监听客户端的连接请求,并处理数据。
  • Client(客户端): 主动发起与服务器的连接,并发送或接收数据。
  • 协议: 常用的协议有TCP(面向连接、可靠传输)和UDP(无连接、不可靠但高效)。

2. 使用TCP协议的Socket通信

(1) 服务器端代码

服务器端需要监听指定的IP地址和端口,等待客户端的连接请求。

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

class TcpServer
{
    static void Main(string[] args)
    {
        // 定义IP地址和端口号
        IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); // 本地回环地址
        int port = 8888;

        // 创建Socket对象
        Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

        try
        {
            // 绑定IP地址和端口
            listener.Bind(new IPEndPoint(ipAddress, port));
            listener.Listen(10); // 设置最大连接数为10
            Console.WriteLine("服务器已启动,等待客户端连接...");

            // 接受客户端连接
            Socket handler = listener.Accept();
            Console.WriteLine("客户端已连接!");

            // 接收数据
            byte[] buffer = new byte[1024];
            int bytesReceived = handler.Receive(buffer);
            string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesReceived);
            Console.WriteLine($"接收到的数据: {receivedData}");

            // 发送响应数据
            string response = "Hello from server!";
            byte[] responseData = Encoding.UTF8.GetBytes(response);
            handler.Send(responseData);

            // 关闭连接
            handler.Shutdown(SocketShutdown.Both);
            handler.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"发生错误: {ex.Message}");
        }
        finally
        {
            listener.Close();
        }
    }
}

(2) 客户端代码

客户端需要主动连接到服务器,并发送或接收数据。

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

class TcpClientExample
{
    static void Main(string[] args)
    {
        // 定义服务器的IP地址和端口号
        string serverIp = "127.0.0.1";
        int port = 8888;

        // 创建Socket对象
        Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        try
        {
            // 连接到服务器
            client.Connect(serverIp, port);
            Console.WriteLine("已连接到服务器!");

            // 发送数据
            string message = "Hello from client!";
            byte[] data = Encoding.UTF8.GetBytes(message);
            client.Send(data);

            // 接收服务器响应
            byte[] buffer = new byte[1024];
            int bytesReceived = client.Receive(buffer);
            string response = Encoding.UTF8.GetString(buffer, 0, bytesReceived);
            Console.WriteLine($"服务器响应: {response}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"发生错误: {ex.Message}");
        }
        finally
        {
            client.Close();
        }
    }
}

3. 使用UDP协议的Socket通信

(1) 服务器端代码

UDP是无连接的协议,服务器不需要显式接受连接。

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

class UdpServer
{
    static void Main(string[] args)
    {
        // 定义IP地址和端口号
        IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
        int port = 9999;

        // 创建Socket对象
        UdpClient udpServer = new UdpClient(port);

        Console.WriteLine("UDP服务器已启动,等待数据...");

        // 接收数据
        IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
        byte[] receivedData = udpServer.Receive(ref remoteEndPoint);
        string message = Encoding.UTF8.GetString(receivedData);
        Console.WriteLine($"接收到的数据: {message} 来自 {remoteEndPoint}");

        // 发送响应数据
        string response = "Hello from UDP server!";
        byte[] responseData = Encoding.UTF8.GetBytes(response);
        udpServer.Send(responseData, responseData.Length, remoteEndPoint);

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

(2) 客户端代码

客户端直接向服务器发送数据,无需建立连接。 

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

class UdpClientExample
{
    static void Main(string[] args)
    {
        // 定义服务器的IP地址和端口号
        string serverIp = "127.0.0.1";
        int port = 9999;

        // 创建Socket对象
        UdpClient udpClient = new UdpClient();

        try
        {
            // 发送数据
            IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(serverIp), port);
            string message = "Hello from UDP client!";
            byte[] data = Encoding.UTF8.GetBytes(message);
            udpClient.Send(data, data.Length, serverEndPoint);

            // 接收服务器响应
            byte[] receivedData = udpClient.Receive(ref serverEndPoint);
            string response = Encoding.UTF8.GetString(receivedData);
            Console.WriteLine($"服务器响应: {response}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"发生错误: {ex.Message}");
        }
        finally
        {
            udpClient.Close();
        }
    }
}

4. 注意事项

  1. 异常处理: 在实际开发中,必须对网络异常(如超时、连接中断等)进行处理。
  2. 多线程支持: 如果需要同时处理多个客户端连接,可以使用多线程或异步编程。
  3. 防火墙和端口: 确保服务器的端口未被防火墙阻止。
  4. 编码格式: 数据传输时需注意编码格式的一致性(如UTF-8)。

以上是C#中Socket通信的基本实现方法。根据实际需求,可以选择TCP或UDP协议,并结合异步编程(如async/await)提高性能和可扩展性。

C# async/await的使用_c# async await用法-CSDN博客文章浏览阅读1.3k次,点赞5次,收藏8次。本文详细介绍了C#中async和await关键字在实现异步编程中的作用,包括如何定义异步方法、await用于等待异步操作完成的特点,以及注意事项,如避免阻塞操作和正确嵌套。这些技术有助于提升程序性能和响应性。 https://blog.csdn.net/wangnaisheng/article/details/136037585?spm=1011.2415.3001.5331

 


网站公告

今日签到

点亮在社区的每一天
去签到