legongju.com
我们一直在努力
2024-12-27 13:04 | 星期五

c# linux开发怎样实现网络通信

在C#中进行Linux开发并实现网络通信,你可以使用.NET Core或.NET 5/6/7等跨平台框架。以下是一个简单的示例,展示了如何使用C#和.NET Core在Linux上实现TCP网络通信。

服务器端

  1. 创建一个新的控制台应用程序

    dotnet new console -o NetworkCommunicationServer
    cd NetworkCommunicationServer
    
  2. 添加必要的NuGet包

    dotnet add package System.Net.Sockets
    
  3. 编写服务器代码

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading.Tasks;
    
    class Program
    {
        static async Task Main(string[] args)
        {
            // 监听端口
            int port = 5000;
            IPAddress ipAddress = IPAddress.Any;
            TcpListener server = null;
    
            try
            {
                server = new TcpListener(ipAddress, port);
                Console.WriteLine($"Server started on {ipAddress}:{port}");
    
                // 开始监听连接
                server.Start();
    
                while (true)
                {
                    // 等待客户端连接
                    Console.Write("Waiting for client connection...");
                    TcpClient client = await server.AcceptTcpClientAsync();
                    Console.WriteLine("Client connected!");
    
                    // 处理客户端请求
                    HandleClient(client);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error: {e.Message}");
            }
            finally
            {
                server?.Stop();
            }
        }
    
        static async Task HandleClient(TcpClient client)
        {
            NetworkStream stream = client.GetStream();
            byte[] buffer = new byte[1024];
            int bytesRead;
    
            // 读取客户端发送的数据
            while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0)
            {
                string data = https://www.yisu.com/ask/Encoding.UTF8.GetString(buffer, 0, bytesRead);"Received: {data}");
    
                // 发送响应给客户端
                string response = "Hello from server!";
                byte[] responseBytes = Encoding.UTF8.GetBytes(response);
                await stream.WriteAsync(responseBytes, 0, responseBytes.Length);
            }
    
            client.Close();
            Console.WriteLine("Client disconnected.");
        }
    }
    

客户端

  1. 创建一个新的控制台应用程序

    dotnet new console -o NetworkCommunicationClient
    cd NetworkCommunicationClient
    
  2. 添加必要的NuGet包

    dotnet add package System.Net.Sockets
    
  3. 编写客户端代码

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading.Tasks;
    
    class Program
    {
        static async Task Main(string[] args)
        {
            // 服务器地址和端口
            string serverAddress = "127.0.0.1";
            int serverPort = 5000;
    
            // 创建TCP客户端
            TcpClient client = new TcpClient(serverAddress, serverPort);
            NetworkStream stream = client.GetStream();
            byte[] buffer = new byte[1024];
            int bytesRead;
    
            // 发送数据给服务器
            string message = "Hello from client!";
            byte[] messageBytes = Encoding.UTF8.GetBytes(message);
            await stream.WriteAsync(messageBytes, 0, messageBytes.Length);
    
            // 读取服务器的响应
            while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0)
            {
                string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                Console.WriteLine($"Received: {response}");
            }
    
            client.Close();
            Console.WriteLine("Disconnected from server.");
        }
    }
    

运行示例

  1. 启动服务器: 在NetworkCommunicationServer目录下运行以下命令:

    dotnet run
    
  2. 启动客户端: 在NetworkCommunicationClient目录下运行以下命令:

    dotnet run
    

你应该会看到服务器和客户端之间的消息传递。

其他网络通信方式

除了TCP,你还可以使用UDP、HTTP/HTTPS、WebSocket等进行网络通信。以下是一些示例:

UDP通信

服务器端

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        int port = 5001;
        IPAddress ipAddress = IPAddress.Any;
        UdpClient udpServer = null;

        try
        {
            udpServer = new UdpClient(port);
            Console.WriteLine($"UDP Server started on {ipAddress}:{port}");

            while (true)
            {
                byte[] bytesReceived = await udpServer.ReceiveAsync();
                string receivedData = https://www.yisu.com/ask/Encoding.UTF8.GetString(bytesReceived.Buffer, 0, bytesReceived.BytesReceived);"Received: {receivedData}");

                string response = "Hello from UDP server!";
                byte[] responseBytes = Encoding.UTF8.GetBytes(response);
                udpServer.Send(responseBytes, responseBytes.Length, bytesReceived.RemoteEndPoint);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error: {e.Message}");
        }
        finally
        {
            udpServer?.Close();
        }
    }
}

客户端

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        string serverAddress = "127.0.0.1";
        int serverPort = 5001;

        UdpClient udpClient = new UdpClient();
        IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(serverAddress), serverPort);

        string message = "Hello from UDP client!";
        byte[] messageBytes = Encoding.UTF8.GetBytes(message);
        udpClient.Send(messageBytes, messageBytes.Length, serverEndPoint);

        byte[] bytesReceived = await udpClient.ReceiveAsync();
        string response = Encoding.UTF8.GetString(bytesReceived.Buffer, 0, bytesReceived.BytesReceived);
        Console.WriteLine($"Received: {response}");

        udpClient.Close();
        Console.WriteLine("Disconnected from UDP server.");
    }
}

HTTP/HTTPS通信

你可以使用HttpClient类进行HTTP请求和响应处理。

服务器端(使用ASP.NET Core):

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;

namespace NetworkCommunicationServer
{
    public class Startup
    {
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello from server!");
                });
            });
        }
    }
}

客户端

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        using var httpClient = new HttpClient();
        HttpResponseMessage response = await httpClient.GetAsync("http://127.0.0.1:5000");
        string responseBody = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseBody);
    }
}

WebSocket通信

服务器端(使用ASP.NET Core):

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.WebSockets;

namespace NetworkCommunicationServer
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.AddWebSocket();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");

                endpoints.MapWebSocket("/ws", new WebSocketOptions()
                {
                    KeepAliveInterval = TimeSpan.Zero,
                    CloseTimeout = TimeSpan.Zero
                });
            });
        }
    }

    public class HomeController : Controller
    {
        [HttpGet]
        public IActionResult Index()
        {
            return View();
        }

        [HttpGet("ws")]
        public async Task WebSocket(WebSocketContext context)
        {
            byte[] buffer = new byte[1024 * 4];
            WebSocketReceiveResult result;

            do
            {
                result = await context.接收Async(new ArraySegment(buffer));
                string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
                Console.WriteLine($"Received: {message}");

                string response = "Hello from server!";
                byte[] responseBytes = Encoding.UTF8.GetBytes(response);
                await context.SendAsync(new ArraySegment(responseBytes));
            } while (!result.CloseStatus.HasValue);

            return new EmptyResult();
        }
    }
}

客户端

using System;
using System.Net.WebSockets;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        using var socket = new ClientWebSocket();
        await socket.ConnectAsync("ws://127.0.0.1:5000/ws", CancellationToken.None);

        string message = "Hello from client!";
        byte[] messageBytes = Encoding.UTF8.GetBytes(message);
        await socket.SendAsync(new ArraySegment(messageBytes), WebSocketMessageType.Text, true);

        byte[] buffer = new byte[1024 * 4];
        WebSocketReceiveResult result;

        do
        {
            result = await socket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
            string response = Encoding.UTF8.GetString(buffer, 0, result.Count);
            Console.WriteLine($"Received: {response}");
        } while (!result.CloseStatus.HasValue);

        socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Goodbye from client!", CancellationToken.None).Wait();
    }
}

这些示例展示了如何在C#中使用.NET Core在Linux上实现不同类型的网络通信。你可以根据需要选择合适的方式进行通信。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/40105.html

相关推荐

  • C# XML文档的创建方式

    C# XML文档的创建方式

    在C#中,可以使用多种方式来创建XML文档。以下是几种常见的方法: 使用XmlDocument类:
    XmlDocument类是.NET Framework中用于处理XML文档的核心类。通过该类...

  • 如何在C#中操作XML数据

    如何在C#中操作XML数据

    在C#中操作XML数据,你可以使用.NET框架自带的System.Xml命名空间。下面是一些基本的操作XML数据的示例: 读取XML数据 假设你有一个名为"sample.xml"的文件,其内...

  • C#读取XML文件的方法是什么

    C#读取XML文件的方法是什么

    在C#中,可以使用System.Xml命名空间下的类来读取XML文件。以下是一个简单的示例,展示了如何使用C#读取XML文件的内容: 首先,创建一个名为sample.xml的XML文件...

  • C#中XML如何解析

    C#中XML如何解析

    在C#中,可以使用System.Xml命名空间中的类来解析XML文档。下面是一个简单的示例,演示如何使用C#解析XML文档: 首先,创建一个名为sample.xml的XML文件: 张三 ...

  • c# linux开发如何处理文件系统

    c# linux开发如何处理文件系统

    在C#中进行Linux文件系统操作时,可以使用.NET Core的System.IO命名空间中的类和方法。以下是一些常用的文件系统操作示例: 创建目录: using System.IO; string...

  • c# linux开发能进行多线程吗

    c# linux开发能进行多线程吗

    是的,C# 在 Linux 开发中可以进行多线程
    要在 Linux 上使用 C# 进行多线程开发,你可以使用 .NET Core 或 .NET 5(或更高版本),它们都支持跨平台开发,包...

  • c# linux开发如何调试代码

    c# linux开发如何调试代码

    在Linux环境下使用C#进行开发时,选择合适的调试工具和方法至关重要。以下是一些常用的C#调试工具和方法,以及调试技巧的详细介绍:
    常用调试工具 Visual S...

  • c# linux开发能运行Windows程序吗

    c# linux开发能运行Windows程序吗

    C# 本身是跨平台的,可以在 Linux 和 Windows 上运行
    要在 Linux 上运行 Windows 程序,您可以使用以下方法之一: 使用 Wine:Wine 是一个允许在 Linux 和其...