可擴充的TCP/IP 伺服器設計模式
在設計需要長時間運作連線的可擴充TCP/IP 伺服器時,請考慮這一點至關重要最高效的網路架構。非同步套接字是建議的方法,因為它們能夠同時處理多個客戶端而不消耗過多的資源。
網路架構
伺服器:
建立一個類別來管理客戶端連接,包括一個清單來保存對活動客戶端的參考。
使用伺服器套接字上的BeginAccept 方法用於偵聽傳入連線並在連線建立時呼叫AcceptCallback使用套接字連接到伺服器。
發送並使用 BeginSend且透過套接字非同步接收資料BeginReceive.資料主要從伺服器流向客戶端,偶爾有來自客戶端的命令.
伺服器定期發送狀態資料到客戶端。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中文網其他相關文章!