当前位置:首页 > 行业动态 > 正文

c#tcp服务器端程序

C# TCP服务器端程序通常包括创建一个TcpListener对象来监听客户端连接,接受连接请求,并使用NetworkStream进行数据传输。

在C#中编写TCP服务器端程序涉及多个关键步骤,包括创建监听套接字、绑定端口、接受客户端连接以及处理数据传输等,以下是一个简单的示例,展示了如何使用C#实现一个基本的TCP服务器端程序:

引入必要的命名空间

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

创建TCP服务器类

定义一个TcpServer类,包含启动服务器、接受客户端连接和处理客户端请求的方法。

public class TcpServer
{
    private TcpListener listener;
    private bool isRunning;
    public TcpServer(int port)
    {
        listener = new TcpListener(IPAddress.Any, port);
        isRunning = false;
    }
    public void Start()
    {
        listener.Start();
        isRunning = true;
        Console.WriteLine($"Server started on port {((IPEndPoint)listener.LocalEndpoint).Port}");
        Task.Run(() => AcceptClientsAsync());
    }
    private async Task AcceptClientsAsync()
    {
        while (isRunning)
        {
            try
            {
                TcpClient client = await listener.AcceptTcpClientAsync();
                Console.WriteLine("Client connected.");
                HandleClientAsync(client);
            }
            catch (ObjectDisposedException)
            {
                // This exception may be thrown if the listener is stopped while accepting clients.
                break;
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error accepting client: {e.Message}");
            }
        }
    }
    private async Task HandleClientAsync(TcpClient client)
    {
        using (NetworkStream stream = client.GetStream())
        {
            byte[] buffer = new byte[1024];
            while (true)
            {
                try
                {
                    int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
                    if (bytesRead == 0) break; // Client disconnected
                    string request = Encoding.ASCII.GetString(buffer, 0, bytesRead);
                    Console.WriteLine($"Received: {request}");
                    string response = ProcessRequest(request);
                    byte[] responseBytes = Encoding.ASCII.GetBytes(response);
                    await stream.WriteAsync(responseBytes, 0, responseBytes.Length);
                }
                catch (Exception e)
                {
                    Console.WriteLine($"Error handling client: {e.Message}");
                    break;
                }
            }
        }
    }
    private string ProcessRequest(string request)
    {
        // 这里可以添加自定义的请求处理逻辑
        return $"Echo: {request}";
    }
    public void Stop()
    {
        listener.Stop();
        isRunning = false;
        Console.WriteLine("Server stopped.");
    }
}

使用TCP服务器类

在主程序中实例化TcpServer对象并启动服务器,可以通过按任意键停止服务器。

class Program
{
    static void Main(string[] args)
    {
        int port = 8000; // 可以根据需要更改端口号
        TcpServer server = new TcpServer(port);
        server.Start();
        Console.WriteLine("Press any key to stop the server...");
        Console.ReadKey();
        server.Stop();
    }
}

FAQs

Q1: 如何同时处理多个客户端连接?

A1: 在上面的示例中,每当有新的客户端连接时,都会创建一个新的任务来处理该客户端的请求,这样可以确保每个客户端都在其自己的线程上被处理,从而实现并发处理多个客户端连接,如果需要处理大量并发连接,可能需要考虑使用线程池或其他并发处理机制来提高效率。

Q2: 如何处理客户端突然断开连接的情况?

A2: 在上面的示例中,如果在读取或写入数据时发生异常(例如客户端断开连接),则会捕获异常并退出当前客户端的处理循环,这样可以避免因单个客户端的异常而导致整个服务器崩溃,可以在HandleClientAsync方法中添加更多的异常处理逻辑,以便在客户端断开连接时进行适当的清理工作(例如关闭网络流、释放资源等)。

小编有话说

通过上面的介绍和示例代码,相信你已经对如何在C#中编写TCP服务器端程序有了一定的了解,实际应用中可能需要根据具体需求进行更多的定制和优化,希望这篇文章能对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言交流。

0