gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:50:22 24 4
gpt4 key购买 nike

我在 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) 以任何方式阻塞

所有这些都包含在 documentation 中:

AcceptTcpClient is a blocking method that returns a TcpClient that you can use to send and receive data. Use the Pending method to determine if connection requests are available in the incoming connection queue if you want to avoid blocking.

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

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

关于c# - C# 中 TCP 通信的服务器端口繁忙问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48717800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com