在C#中進行Linux開發并實現網絡通信,你可以使用.NET Core或.NET 5/6/7等跨平臺框架。以下是一個簡單的示例,展示了如何使用C#和.NET Core在Linux上實現TCP網絡通信。
創建一個新的控制臺應用程序:
dotnet new console -o NetworkCommunicationServer
cd NetworkCommunicationServer
添加必要的NuGet包:
dotnet add package System.Net.Sockets
編寫服務器代碼:
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 = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"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.");
}
}
創建一個新的控制臺應用程序:
dotnet new console -o NetworkCommunicationClient
cd NetworkCommunicationClient
添加必要的NuGet包:
dotnet add package System.Net.Sockets
編寫客戶端代碼:
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.");
}
}
啟動服務器:
在NetworkCommunicationServer
目錄下運行以下命令:
dotnet run
啟動客戶端:
在NetworkCommunicationClient
目錄下運行以下命令:
dotnet run
你應該會看到服務器和客戶端之間的消息傳遞。
除了TCP,你還可以使用UDP、HTTP/HTTPS、WebSocket等進行網絡通信。以下是一些示例:
服務器端:
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 = Encoding.UTF8.GetString(bytesReceived.Buffer, 0, bytesReceived.BytesReceived);
Console.WriteLine($"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.");
}
}
你可以使用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);
}
}
服務器端(使用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<IActionResult> WebSocket(WebSocketContext context)
{
byte[] buffer = new byte[1024 * 4];
WebSocketReceiveResult result;
do
{
result = await context.接收Async(new ArraySegment<byte>(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<byte>(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<byte>(messageBytes), WebSocketMessageType.Text, true);
byte[] buffer = new byte[1024 * 4];
WebSocketReceiveResult result;
do
{
result = await socket.ReceiveAsync(new ArraySegment<byte>(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上實現不同類型的網絡通信。你可以根據需要選擇合適的方式進行通信。