C#中TCP通信的服务器端口繁忙问题

时间:2018-02-10 06:06:55

标签: c# tcp server

我在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服务器。

我正面临服务器端口忙问题。下面是我的服务器和客户端代码。

有什么办法,我可以解决服务器端口忙问题。

1 个答案:

答案 0 :(得分:1)

@MickyD评论的问题是:

Thread.Sleep(30000);

您只接受一个连接,然后睡30秒。显然,在30秒内尝试连接的客户端将无法获得响应(超时)。

实际上,解决方案非常简单 您不需要使用PendingSleep进行所有登录 它足以仅使用AcceptTcpClient

AcceptTcpClient是一种阻止方法。它会阻塞,直到连接到达。

使用Pending的原因是,如果您不想阻止,但是您使用Thread.Sleep(30000)阻止了任何方式

所有这些都由documentation

涵盖
  

AcceptTcpClient是一种阻塞方法,它返回可用于发送和接收数据的TcpClient。如果要避免阻塞,请使用Pending方法确定传入连接队列中的连接请求是否可用。

此外,您不需要检查客户端是否已连接(您正在获得连接的连接......) 所以,你的循环可以变得更简单:

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