首頁 > 後端開發 > C++ > 如何設計具有長時間運行連線的可擴展 TCP/IP 伺服器?

如何設計具有長時間運行連線的可擴展 TCP/IP 伺服器?

Mary-Kate Olsen
發布: 2024-12-29 05:06:09
原創
344 人瀏覽過

How to Design a Scalable TCP/IP Server with Long-Running Connections?

可擴充的TCP/IP 伺服器設計模式

在設計需要長時間運作連線的可擴充TCP/IP 伺服器時,請考慮這一點至關重要最高效的網路架構。非同步套接字是建議的方法,因為它們能夠同時處理多個客戶端而不消耗過多的資源。

網路架構

  • 伺服器:

    • 伺服器:
    • 伺服器:
    啟動服務,至少有一個線程來處理傳入的連線。
  • 使用 BeginReceive 和 EndReceive 方法實作非同步套接字。

    建立一個類別來管理客戶端連接,包括一個清單來保存對活動客戶端的參考。

    使用伺服器套接字上的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 &amp;&amp; conn.socket.Connected)
            {
                lock (conn.socket)
                {
                    conn.socket.Send(message, message.Length, SocketFlags.None);
                }
            }
        }
    }
}
登入後複製

從客戶端接收的資料可以非同步緩衝和處理,在執行緒池上建立作業以防止進一步資料接收的延遲。

    範例程式碼
  • 額外注意事項
額外注意事項額外注意事項考慮使用重組協議來處理傳入的資料片段。 隨時使用單一 BeginAccept 以避免潛在的錯誤。 同步存取共享資源,例如客戶端列表,確保執行緒安全。

以上是如何設計具有長時間運行連線的可擴展 TCP/IP 伺服器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板