我有一个简单的服务器,它从客户端获取字符串并将其打印在屏幕上。我也有简单的客户端,发送数据并关闭:
static void Main()
{
var client = new TcpClient("localhost", 26140);
var stream = client.GetStream();
Byte[] data = System.Text.Encoding.UTF8.GetBytes("CALC qwer");
stream.Write(data, 0, data.Length);
stream.Close();
client.Close();
//Thread.Sleep(100);
}
并且使用未注释的字符串 'Thread.Sleep(100)' 它可以正常工作。但是在评论时,有时(5-10 次运行中的 1 次)客户端不发送字符串。观察wireshark和netstat我注意到客户端发送SYN,ACK包,建立连接并退出而不发送任何东西并且没有关闭套接字。
谁能解释这种行为?为什么睡眠有帮助?我究竟做错了什么?
升级版:
使用此示例代码,在关闭之前添加 flush() 确实有效,感谢 Fox32。
但之后我回到了我的初始代码:
var client = new TcpClient("localhost", 26140);
client.NoDelay = true;
var stream = client.GetStream();
var writer = new StreamWriter(stream);
writer.WriteLine("CALC qwer");
writer.Flush();
stream.Flush();
stream.Close();
client.Close();
即使使用 NoDelay,它也不起作用。这很糟糕 - 通过网络流使用 StreamWriter?
升级版:
这是服务器代码:
static void Main(string[] args)
{
(new Server(26140)).Run();
}
在服务器类中:
public void Run()
{
var listener = new TcpListener(IPAddress.Any, port);
listener.Start();
while (true)
{
try
{
var client = listener.AcceptTcpClient();
Console.WriteLine("Client accepted: " + client.Client.RemoteEndPoint);
var stream = client.GetStream();
stream.ReadTimeout = 2000;
byte[] buffer = new byte[1000];
stream.Read(buffer, 0, 1000);
var s = Encoding.UTF8.GetString(buffer);
Console.WriteLine(s);
}
catch (Exception ex)
{
Console.WriteLine("ERROR! " + ex.Message);
}
}
}
升级版:
甚至添加 Sleep(1) 会使同时运行的 30-50 个客户端中的 1 个发生崩溃。添加 Sleep(10) 似乎可以完全解决它,我无法捕捉到任何崩溃。不明白,为什么socket需要这几毫秒才能正确关闭。