C#异步Socket通信编程:从服务器到客户端的详细实现流程

在C#中进行Socket通信编程时,异步实现可以显著提高应用程序的性能和响应能力。通过异步操作,你可以在等待网络I/O操作完成时执行其他任务,从而避免线程阻塞。以下是C#中Socket通信编程的异步实现流程分析:

图片[1]_C#异步Socket通信编程:从服务器到客户端的详细实现流程_知途无界

1. 引入必要的命名空间

首先,确保你在代码中引入了必要的命名空间:

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

2. 异步服务器端实现流程

2.1 初始化Socket并绑定地址

创建一个Socket对象,并将其绑定到指定的IP地址和端口号。

Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
listener.Bind(localEndPoint);
listener.Listen(10);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
listener.Bind(localEndPoint);
listener.Listen(10);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); listener.Bind(localEndPoint); listener.Listen(10);

2.2 异步接受连接

使用AcceptAsync方法异步接受连接。

Task<Socket> acceptTask = listener.AcceptAsync();
acceptTask.Wait(); // 或者使用await
Socket handler = acceptTask.Result;
Task<Socket> acceptTask = listener.AcceptAsync();
acceptTask.Wait(); // 或者使用await
Socket handler = acceptTask.Result;
Task<Socket> acceptTask = listener.AcceptAsync(); acceptTask.Wait(); // 或者使用await Socket handler = acceptTask.Result;

或者使用async/await语法:

Socket handler = await listener.AcceptAsync();
Socket handler = await listener.AcceptAsync();
Socket handler = await listener.AcceptAsync();

2.3 异步读取数据

创建一个缓冲区,并使用ReceiveAsync方法异步读取数据。

byte[] buffer = new byte[1024];
int bytesRead = await handler.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);
string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
byte[] buffer = new byte[1024];
int bytesRead = await handler.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);
string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
byte[] buffer = new byte[1024]; int bytesRead = await handler.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None); string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);

2.4 异步发送数据

使用SendAsync方法异步发送数据。

byte[] msg = Encoding.ASCII.GetBytes("Hello from server");
await handler.SendAsync(new ArraySegment<byte>(msg), SocketFlags.None);
byte[] msg = Encoding.ASCII.GetBytes("Hello from server");
await handler.SendAsync(new ArraySegment<byte>(msg), SocketFlags.None);
byte[] msg = Encoding.ASCII.GetBytes("Hello from server"); await handler.SendAsync(new ArraySegment<byte>(msg), SocketFlags.None);

2.5 关闭连接

在数据通信完成后,关闭连接。

handler.Shutdown(SocketShutdown.Both);
handler.Close();
handler.Shutdown(SocketShutdown.Both);
handler.Close();
handler.Shutdown(SocketShutdown.Both); handler.Close();

3. 异步客户端实现流程

3.1 初始化Socket并连接到服务器

创建一个Socket对象,并连接到服务器。

Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);
await client.ConnectAsync(remoteEP);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);
await client.ConnectAsync(remoteEP);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000); await client.ConnectAsync(remoteEP);

3.2 异步发送数据

使用SendAsync方法异步发送数据。

byte[] msg = Encoding.ASCII.GetBytes("Hello from client");
await client.SendAsync(new ArraySegment<byte>(msg), SocketFlags.None);
byte[] msg = Encoding.ASCII.GetBytes("Hello from client");
await client.SendAsync(new ArraySegment<byte>(msg), SocketFlags.None);
byte[] msg = Encoding.ASCII.GetBytes("Hello from client"); await client.SendAsync(new ArraySegment<byte>(msg), SocketFlags.None);

3.3 异步读取数据

使用ReceiveAsync方法异步读取数据。

byte[] buffer = new byte[1024];
int bytesRead = await client.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);
string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
byte[] buffer = new byte[1024];
int bytesRead = await client.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);
string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
byte[] buffer = new byte[1024]; int bytesRead = await client.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None); string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);

3.4 关闭连接

在数据通信完成后,关闭连接。

client.Shutdown(SocketShutdown.Both);
client.Close();
client.Shutdown(SocketShutdown.Both);
client.Close();
client.Shutdown(SocketShutdown.Both); client.Close();

4. 错误处理

在异步操作中,通常需要添加错误处理逻辑。例如,使用try-catch块来捕获并处理异常。

try
{
// 异步操作代码
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
try
{
    // 异步操作代码
}
catch (Exception e)
{
    Console.WriteLine(e.ToString());
}
try { // 异步操作代码 } catch (Exception e) { Console.WriteLine(e.ToString()); }

5. 完整示例

以下是一个简单的异步Socket通信示例,包括服务器和客户端的实现。

异步服务器示例

class AsyncServer
{
public static async Task StartServer()
{
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
listener.Bind(localEndPoint);
listener.Listen(10);
Console.WriteLine("Waiting for a connection...");
while (true)
{
Socket handler = await listener.AcceptAsync();
Console.WriteLine("Connected!");
byte[] buffer = new byte[1024];
int bytesRead = await handler.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);
string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine("Received: {0}", data);
byte[] msg = Encoding.ASCII.GetBytes("Hello from server");
await handler.SendAsync(new ArraySegment<byte>(msg), SocketFlags.None);
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
}
}
class AsyncServer
{
    public static async Task StartServer()
    {
        Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
        listener.Bind(localEndPoint);
        listener.Listen(10);

        Console.WriteLine("Waiting for a connection...");

        while (true)
        {
            Socket handler = await listener.AcceptAsync();
            Console.WriteLine("Connected!");

            byte[] buffer = new byte[1024];
            int bytesRead = await handler.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);
            string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
            Console.WriteLine("Received: {0}", data);

            byte[] msg = Encoding.ASCII.GetBytes("Hello from server");
            await handler.SendAsync(new ArraySegment<byte>(msg), SocketFlags.None);

            handler.Shutdown(SocketShutdown.Both);
            handler.Close();
        }
    }
}
class AsyncServer { public static async Task StartServer() { Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); listener.Bind(localEndPoint); listener.Listen(10); Console.WriteLine("Waiting for a connection..."); while (true) { Socket handler = await listener.AcceptAsync(); Console.WriteLine("Connected!"); byte[] buffer = new byte[1024]; int bytesRead = await handler.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None); string data = Encoding.ASCII.GetString(buffer, 0, bytesRead); Console.WriteLine("Received: {0}", data); byte[] msg = Encoding.ASCII.GetBytes("Hello from server"); await handler.SendAsync(new ArraySegment<byte>(msg), SocketFlags.None); handler.Shutdown(SocketShutdown.Both); handler.Close(); } } }

异步客户端示例

class AsyncClient
{
public static async Task StartClient()
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);
await client.ConnectAsync(remoteEP);
Console.WriteLine("Connected to server...");
byte[] msg = Encoding.ASCII.GetBytes("Hello from client");
await client.SendAsync(new ArraySegment<byte>(msg), SocketFlags.None);
byte[] buffer = new byte[1024];
int bytesRead = await client.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);
string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine("Received: {0}", data);
client.Shutdown(SocketShutdown.Both);
client.Close();
}
}
class AsyncClient
{
    public static async Task StartClient()
    {
        Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
        IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);

        await client.ConnectAsync(remoteEP);

        Console.WriteLine("Connected to server...");

        byte[] msg = Encoding.ASCII.GetBytes("Hello from client");
        await client.SendAsync(new ArraySegment<byte>(msg), SocketFlags.None);

        byte[] buffer = new byte[1024];
        int bytesRead = await client.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);
        string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
        Console.WriteLine("Received: {0}", data);

        client.Shutdown(SocketShutdown.Both);
        client.Close();
    }
}
class AsyncClient { public static async Task StartClient() { Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000); await client.ConnectAsync(remoteEP); Console.WriteLine("Connected to server..."); byte[] msg = Encoding.ASCII.GetBytes("Hello from client"); await client.SendAsync(new ArraySegment<byte>(msg), SocketFlags.None); byte[] buffer = new byte[1024]; int bytesRead = await client.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None); string data = Encoding.ASCII.GetString(buffer, 0, bytesRead); Console.WriteLine("Received: {0}", data); client.Shutdown(SocketShutdown.Both); client.Close(); } }

总结

通过异步Socket编程,你可以实现高效的网络通信,而无需阻塞线程。上述流程分析涵盖了异步服务器和客户端的基本实现步骤,并提供了简单的示例代码。在实际应用中,你可能需要根据具体需求进行更多的优化和错误处理。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞11 分享
Time and experience heals pain.
时间和经历会抚平一切伤痛
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容