我在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服务器。
我正面临服务器端口忙问题。下面是我的服务器和客户端代码。
有什么办法,我可以解决服务器端口忙问题。
答案 0 :(得分:1)
@MickyD评论的问题是:
Thread.Sleep(30000);
您只接受一个连接,然后睡30秒。显然,在30秒内尝试连接的客户端将无法获得响应(超时)。
实际上,解决方案非常简单
您不需要使用Pending
和Sleep
进行所有登录
它足以仅使用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);
}