赞
踩
网络通信是现代软件开发中不可或缺的一部分,特别是在分布式系统和互联网应用中。C#提供了丰富的网络编程接口,尤其是基于Socket的TCP/IP协议栈编程,可以实现高性能的网络通信。以下从零开始逐步介绍如何在C#中使用Socket进行高性能网络通信编程,包括创建Socket、连接服务器、发送和接收数据,以及处理并发和错误等,包含详细的代码和注释。
Csharp
- using System.Net;
- using System.Net.Sockets;
-
- public class NetworkClient
- {
- private Socket _clientSocket;
-
- public void Initialize(string serverAddress, int serverPort)
- {
- // 创建Socket实例
- _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-
- // 解析服务器地址
- IPAddress serverIp = IPAddress.Parse(serverAddress);
-
- // 创建终结点
- IPEndPoint serverEndPoint = new IPEndPoint(serverIp, serverPort);
-
- // 连接到服务器
- ConnectToServer(serverEndPoint);
- }
-
- private void ConnectToServer(IPEndPoint endPoint)
- {
- try
- {
- _clientSocket.Connect(endPoint);
- Console.WriteLine("Connected to server.");
- }
- catch (SocketException e)
- {
- Console.WriteLine($"Failed to connect: {e.Message}");
- Dispose();
- }
- }
-
- // 其他方法...
- }
Csharp
- public void Send(byte[] data)
- {
- if (_clientSocket.Connected)
- {
- try
- {
- // 发送数据
- int bytesSent = _clientSocket.Send(data);
- Console.WriteLine($"Sent {bytesSent} bytes.");
- }
- catch (SocketException e)
- {
- Console.WriteLine($"Error sending data: {e.Message}");
- Dispose();
- }
- }
- else
- {
- Console.WriteLine("Not connected to server.");
- }
- }
Csharp
- public byte[] Receive(int bufferSize)
- {
- byte[] receivedData = new byte[bufferSize];
-
- if (_clientSocket.Connected)
- {
- try
- {
- // 接收数据
- int bytesReceived = _clientSocket.Receive(receivedData);
- Console.WriteLine($"Received {bytesReceived} bytes.");
- Array.Resize(ref receivedData, bytesReceived);
- return receivedData;
- }
- catch (SocketException e)
- {
- Console.WriteLine($"Error receiving data: {e.Message}");
- Dispose();
- return null;
- }
- }
- else
- {
- Console.WriteLine("Not connected to server.");
- return null;
- }
- }
1. 异步编程
Csharp
- public async Task SendAsync(byte[] data)
- {
- if (_clientSocket.Connected)
- {
- try
- {
- await _clientSocket.SendAsync(new ArraySegment<byte>(data), SocketFlags.None);
- Console.WriteLine("Data sent asynchronously.");
- }
- catch (SocketException e)
- {
- Console.WriteLine($"Error sending data: {e.Message}");
- Dispose();
- }
- }
- else
- {
- Console.WriteLine("Not connected to server.");
- }
- }
-
- public async Task<byte[]> ReceiveAsync(int bufferSize)
- {
- byte[] receivedData = new byte[bufferSize];
-
- if (_clientSocket.Connected)
- {
- try
- {
- var result = await _clientSocket.ReceiveAsync(new ArraySegment<byte>(receivedData), SocketFlags.None);
- Console.WriteLine($"Received {result.ReceivedBytes} bytes asynchronously.");
- Array.Resize(ref receivedData, result.ReceivedBytes);
- return receivedData;
- }
- catch (SocketException e)
- {
- Console.WriteLine($"Error receiving data: {e.Message}");
- Dispose();
- return null;
- }
- }
- else
- {
- Console.WriteLine("Not connected to server.");
- return null;
- }
- }
2. 错误处理与重连
Csharp
- private void HandleSocketError(SocketError error)
- {
- switch (error)
- {
- case SocketError.ConnectionAborted:
- case SocketError.ConnectionReset:
- case SocketError.NetworkUnreachable:
- Console.WriteLine($"Disconnected from server: {error}");
- Reconnect();
- break;
- default:
- Console.WriteLine($"Unknown error: {error}");
- Dispose();
- break;
- }
- }
-
- private async Task Reconnect()
- {
- // 在此处实现重连逻辑,如等待一段时间后重新尝试连接服务器
- await Task.Delay(5000);
- ConnectToServer(_serverEndPoint);
- }
C#中的Socket编程为开发者提供了直接访问TCP/IP协议栈的能力,可以实现高效的网络通信。通过创建Socket实例、连接服务器、发送和接收数据,以及处理并发和错误,可以构建稳定、高性能的网络客户端。同时,利用异步编程模型和适当的错误处理机制,可以进一步提升网络通信的性能和可靠性。以上示例代码展示了从零开始实现C# Socket编程的关键步骤和细节,为实际项目中的网络通信开发奠定了基础。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。