スケーラブルな TCP/IP サーバーの設計パターン
長時間実行される接続を必要とするスケーラブルな TCP/IP サーバーを設計する場合、考慮することが重要です最も効率的なネットワーク アーキテクチャ。非同期ソケットは、過剰なリソースを消費せずに複数のクライアントを同時に処理できるため、推奨されるアプローチです。
ネットワーク アーキテクチャ
サーバー:
クライアント:
データ フロー
コード例
using System; using System.Net; using System.Net.Sockets; namespace TcpServer { class xConnection { public byte[] buffer; public System.Net.Sockets.Socket socket; } class Server { private List<xConnection> _sockets; private System.Net.Sockets.Socket _serverSocket; private int _port; private int _backlog; public bool Start() { IPHostEntry localhost = Dns.GetHostEntry(Dns.GetHostName()); IPEndPoint serverEndPoint = new IPEndPoint(localhost.AddressList[0], _port); try { _serverSocket = new Socket(serverEndPoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); _serverSocket.Bind(serverEndPoint); _serverSocket.Listen(_backlog); _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket); return true; } catch (Exception e) { // Handle exceptions appropriately return false; } } private void AcceptCallback(IAsyncResult result) { try { Socket serverSocket = (Socket)result.AsyncState; xConnection conn = new xConnection(); conn.socket = serverSocket.EndAccept(result); conn.buffer = new byte[_bufferSize]; lock (_sockets) { _sockets.Add(conn); } conn.socket.BeginReceive(conn.buffer, 0, conn.buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), conn); _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket); } catch (Exception e) { // Handle exceptions appropriately } } private void Send(byte[] message, xConnection conn) { if (conn != null && conn.socket.Connected) { lock (conn.socket) { conn.socket.Send(message, message.Length, SocketFlags.None); } } } } }
追加考慮事項
以上が長時間実行される接続を備えたスケーラブルな TCP/IP サーバーを設計するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。