c#tcp服务器端程序
- 行业动态
- 2025-03-01
- 1
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服务器端程序有了一定的了解,实际应用中可能需要根据具体需求进行更多的定制和优化,希望这篇文章能对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言交流。