level 2
H一_一H
楼主
这是服务端的代码
public static async void Saver()
{
TcpListener listener = new(IPAddress.Any, 7123);
listener.Start();
try
{
while (true)
{
await Console.Out.WriteLineAsync("端口7123监听中。。。。");
using (TcpClient tc = await listener.AcceptTcpClientAsync())
using (NetworkStream ns = tc.GetStream())
{
byte[] buff = new byte[1024];
int readStart = 0;
int readEnd = 4;
//while (ns.DataAvailable)
//{
// readStart += await ns.ReadAsync(buff, readStart, readEnd);
//}
do
{
readStart += await ns.ReadAsync(buff, readStart, readEnd);
} while (ns.DataAvailable);
await Console.Out.WriteLineAsync($"接收到数据:{Encoding.UTF8.GetString(buff)}");
string SaverMessage = "服务器:已完成传输!!";
await ns.WriteAsync(Encoding.UTF8.GetBytes(SaverMessage, 0, SaverMessage.Length));
}
}
}
catch (Exception ex)
{
listener.Stop();
await Console.Out.WriteLineAsync($"发生异常:{ex.Message}");
}
}
如果是按照这个代码编译出来的,用的do循环读取数据,可以接收客户端传过来的数据,一切正常。
但是使用注释掉的那段while循环,不使用do循环,在VS编译器调试模式下的服务端可以正常接收客户端的数据,而编译出来的服务端程序却无法正常接收到客户端传输出来的数据,然后我调试了下,发现编译出来的程序里面DataAvailable值是false,所以导致了服务端认为没有有效数据就停止了读取,并且一直在等待客户端传输数据,而客户端也一直在等待服务端接收数据。
而在编辑器调试模式下DataAvailable的值是true,服务端认为NetworkStream有有效数据所以就开始读取了,就一切正常。
为什么两种模式下这个DataAvailable的值在while循环会有区别?难道是编译器的bug?还是有什么特别的机制。
2023年03月23日 02点03分
1
public static async void Saver()
{
TcpListener listener = new(IPAddress.Any, 7123);
listener.Start();
try
{
while (true)
{
await Console.Out.WriteLineAsync("端口7123监听中。。。。");
using (TcpClient tc = await listener.AcceptTcpClientAsync())
using (NetworkStream ns = tc.GetStream())
{
byte[] buff = new byte[1024];
int readStart = 0;
int readEnd = 4;
//while (ns.DataAvailable)
//{
// readStart += await ns.ReadAsync(buff, readStart, readEnd);
//}
do
{
readStart += await ns.ReadAsync(buff, readStart, readEnd);
} while (ns.DataAvailable);
await Console.Out.WriteLineAsync($"接收到数据:{Encoding.UTF8.GetString(buff)}");
string SaverMessage = "服务器:已完成传输!!";
await ns.WriteAsync(Encoding.UTF8.GetBytes(SaverMessage, 0, SaverMessage.Length));
}
}
}
catch (Exception ex)
{
listener.Stop();
await Console.Out.WriteLineAsync($"发生异常:{ex.Message}");
}
}
如果是按照这个代码编译出来的,用的do循环读取数据,可以接收客户端传过来的数据,一切正常。
但是使用注释掉的那段while循环,不使用do循环,在VS编译器调试模式下的服务端可以正常接收客户端的数据,而编译出来的服务端程序却无法正常接收到客户端传输出来的数据,然后我调试了下,发现编译出来的程序里面DataAvailable值是false,所以导致了服务端认为没有有效数据就停止了读取,并且一直在等待客户端传输数据,而客户端也一直在等待服务端接收数据。
而在编辑器调试模式下DataAvailable的值是true,服务端认为NetworkStream有有效数据所以就开始读取了,就一切正常。
为什么两种模式下这个DataAvailable的值在while循环会有区别?难道是编译器的bug?还是有什么特别的机制。