[英]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 秒內嘗試連接的客戶端將不會得到響應(超時)。
其實,解決辦法很簡單。
您不需要使用Pending
和Sleep
所有登錄
僅使用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.