多客户端服务器行为异常
本文关键字:异常 服务器 客户端 | 更新日期: 2023-09-27 18:34:11
下面是一个代码段。我正在尝试分别处理上游和下游。但不幸的是,handleUpStream() 在 handleDownStream 之后从未发生过。
如果我删除句柄下游,一切都很好。我在handleDownStream中缺少一些东西,我不知道是什么。
public void run()
{
while (running)
{
if (ClientPool == null)
continue;
foreach (Client c in ClientPool)
{
NetworkStream networkStream = c.getTcpClient().GetStream();
handleDownStream(c, networkStream);
handleUpstream(c, networkStream);
}
}
}
public void handleDownStream(Client c, NetworkStream networkstream)
{
try
{
networkstream.Read(bytesFrom, 0, (int)c.getTcpClient().ReceiveBufferSize);
dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
Console.WriteLine("Message From: " + c.getClientIp() + " : " + dataFromClient);
dataFromClient = null;
bytesFrom = new byte[10025];
}
catch (Exception e)
{
// I tried to see if there was some sort of exception here that was a silent killer.
Console.WriteLine(e.ToString());
return;
}
}
public void handleUpstream(Client c, NetworkStream networkstream)
{
// The below never happens.
Console.WriteLine("this lol");
if (c.getTimeSinceLastMessage() > 30000 && c.getPinged())
{
Console.WriteLine("Removing Client From Pool, " + c.getClientIp());
removeClientFromPool(c);
return;
}
if (c.getTimeSinceLastMessage() > 15000 && c.getPinged() == false)
{
Console.WriteLine("Sending ping to Client, " + c.getClientIp());
c.switchPinged();
bytesToSend = Encoding.ASCII.GetBytes("ping");
networkstream.Write(bytesToSend, 0, bytesToSend.Length);
networkstream.Flush();
bytesToSend = null;
}
}
嗯,这很尴尬...
除了检查它之外,您还可以阅读,还需要检查那里是否有数据可以读取......对于那些像我这样的新手或忘记检查这里是更新的代码。很明显,如果你调用networkstream.read(),它会等待一条消息(它与线程的同步器)。
这是修订后的工作代码,适用于那些需要查看发生了什么的人。
public void run()
{
while (running)
{
if (ClientPool == null)
continue;
foreach (Client c in ClientPool)
{
NetworkStream networkStream = c.getTcpClient().GetStream();
if (networkStream.CanRead)
handleDownStream(c, networkStream);
handleUpstream(c, networkStream);
}
}
}
public void handleDownStream(Client c, NetworkStream networkstream)
{
if (networkstream.DataAvailable == false)
return;
try
{
networkstream.Read(bytesFrom, 0, (int)c.getTcpClient().ReceiveBufferSize);
dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
Console.WriteLine("Message From: " + c.getClientIp() + " : " + dataFromClient);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
return;
}
}
public void handleUpstream(Client c, NetworkStream networkstream)
{
if (c.getTimeSinceLastMessage() > 30000 && c.getPinged())
{
Console.WriteLine("Removing Client From Pool, " + c.getClientIp());
removeClientFromPool(c);
return;
}
if (c.getTimeSinceLastMessage() > 15000 && c.getPinged() == false)
{
Console.WriteLine("Sending ping to Client, " + c.getClientIp());
c.switchPinged();
bytesToSend = Encoding.ASCII.GetBytes("ping");
networkstream.Write(bytesToSend, 0, bytesToSend.Length);
networkstream.Flush();
bytesToSend = null;
}
}