- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 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)
以任何方式阻塞
所有这些都包含在 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/
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以使为on-topic。 6
我们正在使用 PHP 和 Mysql 开发一个基于 Web 的应用程序。如您所知,使用 Web 界面备份大型数据库存在限制,因此我需要一个解决方案来通过以下条件备份我们的大型数据库: 该过程可以在没有
有什么方法可以检测主线程何时被锁定/忙碌(也就是不会响应触摸事件)? 可能的方向检查 dispatch_get_main_queue 的大小(但我不知道如何操作这个对象来查看它的大小) [[UIApp
我已在 Windows 7 64 位上安装了 WAMP。当我尝试启动它时,它说端口 80 被“服务器:Microsoft HTTPAPI/2.0”使用。 我检查了一下,没有安装IIS。我该怎么办? 最
我们有一个 mongoosejs 客户端,它查询大型 mongodb 集合(大约 1000 万条记录)并通过管道传输到转换流。当我们运行此代码时, Node 进程占用 100% CPU 并且变得繁忙,
我是一名优秀的程序员,十分优秀!