簡體   English   中英

C#中TCP通信的服務器端口繁忙問題

[英]Server port busy issue with TCP Communication in C#

我在 C# 中使用 TCP 通信進行客戶端服務器通信。

許多客戶端一次嘗試連接到 TCP 服務器。

我正面臨服務器端口繁忙的問題。 下面是我的服務器和客戶端代碼。

有什么辦法,我可以解決服務器端口繁忙的問題。

Server Code
     /// <summary>
        /// 
        /// </summary>
        public void initializeListener(int iPortNumber,int iActivationPortNumber)
        {
            try
            {
                // BLTablePrototype.TablePrototypeDetails();
                System.Net.IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
                System.Net.IPAddress ipaddress = ipHostInfo.AddressList[0];

                serverSocket = new TcpListener(ipaddress, iPortNumber);

                try
                {
                    serverSocket.Stop();

                }
                catch { }

                serverSocket.Start();

                Common.BLConstants.isListnerStarted = true;



                //StartAccept();
                //WaitForClients();
            }
            catch (Exception ex)
            {

            }
        }


        public void ReceiveTCP()
        {  
            try
            {
                while (true)
                {
                    if (serverSocket.Pending())
                    {
                        TcpClient client = client = serverSocket.AcceptTcpClient();                        
                        if (client.Connected)
                        {
                            Thread thread = new Thread(WorkThread);
                            thread.Start(client);
                        }                      
                    }
                    else
                    {
                        Thread.Sleep(30000);
                    }
                }

            }
            catch (Exception ex)
            {

            }

        }


client Code

  client = new TcpClient();
                var result = client.BeginConnect(Wipro.EUA.Library.Cryptography.Decrypt(Common.BLConstants.strServerIPAddress), iPortnumber, null, null);
                result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2));

                if (client.Connected)
                {

                    byte[] SendingBuffer = Encoding.UTF8.GetBytes(XElement.ToString());
                    netstream = client.GetStream();

                    int NoOfPackets = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(SendingBuffer.Length) / Convert.ToDouble(BLConstants.iBufferSize)));
                    int TotalLength = (int)SendingBuffer.Length, CurrentPacketLength, FinalLength = 0, RemainingLength = TotalLength;
                    for (int k = 0; k < NoOfPackets; k++)
                    {
                        if (RemainingLength > BLConstants.iBufferSize)
                        {
                            if (k == 0)
                                CurrentPacketLength = k * BLConstants.iBufferSize;
                            else
                                CurrentPacketLength = k * BLConstants.iBufferSize;

                            FinalLength = CurrentPacketLength + BLConstants.iBufferSize;
                            RemainingLength = TotalLength - FinalLength;
                            netstream.Write(SendingBuffer, CurrentPacketLength, BLConstants.iBufferSize);
                        }
                        else
                        {
                            CurrentPacketLength = FinalLength;
                            netstream.Write(SendingBuffer, CurrentPacketLength, TotalLength - CurrentPacketLength);
                        }
                    }
                }

                client.EndConnect(result);
                isSuccess = true;

我在 C# 中使用 TCP 通信進行客戶端服務器通信。

許多客戶端一次嘗試連接到 TCP 服務器。

我正面臨服務器端口繁忙的問題。 下面是我的服務器和客戶端代碼。

有什么辦法,我可以解決服務器端口繁忙的問題。

@MickyD 評論的問題是:

Thread.Sleep(30000);

您只接受一個連接,然后休眠 30 秒。 顯然,在這 30 秒內嘗試連接的客戶端將不會得到響應(超時)。

其實,解決辦法很簡單。
您不需要使用PendingSleep所有登錄
僅使用AcceptTcpClient足夠了。

AcceptTcpClient是一種阻塞方法。 它將阻塞,直到連接到達。

使用Pending的原因是如果你不想阻塞,但你正在以任何方式阻塞Thread.Sleep(30000)

所有這些都包含在文檔中

AcceptTcpClient 是一種阻塞方法,它返回可用於發送和接收數據的 TcpClient。 如果您想避免阻塞,請使用 Pending 方法來確定傳入連接隊列中是否有可用的連接請求。

此外,您不需要檢查客戶端是否已連接(您正在連接連接...)因此,您的循環可以變得更簡單:

while (true)
{
    TcpClient client = client = serverSocket.AcceptTcpClient();                        
    Thread thread = new Thread(WorkThread);
    thread.Start(client);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM