条件为假时出现的 if 语句 (System.Net)
if statement occuring while condition is false (System.Net)
我是新来的,所以如果 post 的格式很糟糕,我深表歉意。
所以我遇到的问题...
我正在制作一个基于 Tcp 的消息传递应用程序,类似于 Discord、Teamspeak 等。正如您在下面看到的,我有一个函数 returns 从网络流中提取一个字节 []。我还有一个 if/else 语句来确保该函数不会尝试从未连接的流中提取数据,因此我有一个 bool (connected) 来确定连接的状态。此 bool 已正确更新以匹配连接状态。起初我认为这可能是问题,但我通过调试发现它不是。
private byte[] RecieveData(TcpClient server)
{
byte[] data = new byte[1024];
if (connected)
{
6th line -> server.GetStream().Read(data, 0, data.Length);
return data;
}
else
{
return null;
}
}
Picture of debugging (cant add images for some reason)
我的问题是,为什么第 6 行代码 (server.GetStream().Read(data, 0, data.Length);) 运行 当 if 条件为假时。
如果你需要我的任何东西(图片、代码等),尽管问!
任何帮助将不胜感激。谢谢!
最小可重现示例
客户:
按执行顺序
private void ServerDisconnect(TcpClient server, byte[] data) //Called from a button
{
connected = false;
Server = null;
Disconnect(server);
}
public void Disconnect(TcpClient server)// Checks for a connection, if there is, send DISCON request to server, if not dont
{
if (server.Connected) SendMessage(server, DISCON, currentUser);
connected = false;
server.Close();
}
private void SendMessage(TcpClient server, byte code, User user)// Uses AddMessageCode method to specify what type of request the message is.
{
NetworkStream stream = server.GetStream();
byte[] data = AddMessageCode(code, ObjectToByteArray(user));//Uses a simple Binary converter to serialize a class.
stream.Write(data, 0, data.Length);//Sends request to server
}
private byte[] AddMessageCode(byte code, byte[] data)// Adds the byte code to the start of the data array.
{
byte[] newData = new byte[data.Length + 1];
newData[0] = code;
Array.Copy(data, 0, newData, 1, data.Length);
return newData;
}
理论上,下面的方法应该不会出错。但确实如此。
private byte[] RecieveData(TcpClient server)
{
byte[] data = new byte[1024];
if (server.Connected)
{
server.GetStream().Read(data, 0, data.Length);
return data;
}
else
{
return null;
}
}
如果这还不够清楚。我很抱歉。
在此特定实例中,if 语句已在条件为真时执行。我不明白的部分是 stream.Read()
方法等到接收到数据才能继续。
如果这没有意义,这是@mjwills 的类比,
if语句是房子,门是条件。如果你在门开着的时候进屋(条件为真)不管门是否开着(条件为真或假) 你在屋子里(if 语句中的代码正在执行)。在这种情况下,里面的代码并没有很快完成,它等待来自流的数据。
感谢 Whosebug 社区在问题发布后的 10 分钟内帮助我理解了这一点!
我是新来的,所以如果 post 的格式很糟糕,我深表歉意。
所以我遇到的问题...
我正在制作一个基于 Tcp 的消息传递应用程序,类似于 Discord、Teamspeak 等。正如您在下面看到的,我有一个函数 returns 从网络流中提取一个字节 []。我还有一个 if/else 语句来确保该函数不会尝试从未连接的流中提取数据,因此我有一个 bool (connected) 来确定连接的状态。此 bool 已正确更新以匹配连接状态。起初我认为这可能是问题,但我通过调试发现它不是。
private byte[] RecieveData(TcpClient server)
{
byte[] data = new byte[1024];
if (connected)
{
6th line -> server.GetStream().Read(data, 0, data.Length);
return data;
}
else
{
return null;
}
}
Picture of debugging (cant add images for some reason)
我的问题是,为什么第 6 行代码 (server.GetStream().Read(data, 0, data.Length);) 运行 当 if 条件为假时。
如果你需要我的任何东西(图片、代码等),尽管问!
任何帮助将不胜感激。谢谢!
最小可重现示例
客户:
按执行顺序
private void ServerDisconnect(TcpClient server, byte[] data) //Called from a button
{
connected = false;
Server = null;
Disconnect(server);
}
public void Disconnect(TcpClient server)// Checks for a connection, if there is, send DISCON request to server, if not dont
{
if (server.Connected) SendMessage(server, DISCON, currentUser);
connected = false;
server.Close();
}
private void SendMessage(TcpClient server, byte code, User user)// Uses AddMessageCode method to specify what type of request the message is.
{
NetworkStream stream = server.GetStream();
byte[] data = AddMessageCode(code, ObjectToByteArray(user));//Uses a simple Binary converter to serialize a class.
stream.Write(data, 0, data.Length);//Sends request to server
}
private byte[] AddMessageCode(byte code, byte[] data)// Adds the byte code to the start of the data array.
{
byte[] newData = new byte[data.Length + 1];
newData[0] = code;
Array.Copy(data, 0, newData, 1, data.Length);
return newData;
}
理论上,下面的方法应该不会出错。但确实如此。
private byte[] RecieveData(TcpClient server)
{
byte[] data = new byte[1024];
if (server.Connected)
{
server.GetStream().Read(data, 0, data.Length);
return data;
}
else
{
return null;
}
}
如果这还不够清楚。我很抱歉。
在此特定实例中,if 语句已在条件为真时执行。我不明白的部分是 stream.Read()
方法等到接收到数据才能继续。
如果这没有意义,这是@mjwills 的类比,
if语句是房子,门是条件。如果你在门开着的时候进屋(条件为真)不管门是否开着(条件为真或假) 你在屋子里(if 语句中的代码正在执行)。在这种情况下,里面的代码并没有很快完成,它等待来自流的数据。
感谢 Whosebug 社区在问题发布后的 10 分钟内帮助我理解了这一点!