Skalierbares TCP/IP-Server-Entwurfsmuster
Beim Entwurf eines skalierbaren TCP/IP-Servers, der lang laufende Verbindungen erfordert, ist es wichtig, dies zu berücksichtigen die effizienteste Netzwerkarchitektur. Asynchrone Sockets sind ein empfohlener Ansatz, da sie mehrere Clients gleichzeitig verwalten können, ohne übermäßige Ressourcen zu verbrauchen.
Netzwerkarchitektur
Server :
Client:
Datenfluss
Beispielcode
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); } } } } }
Zusätzliche Überlegungen
Das obige ist der detaillierte Inhalt vonWie entwerfe ich einen skalierbaren TCP/IP-Server mit lang andauernden Verbindungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!