gpt4 book ai didi

c# - 动态输入数据时 TCP 服务器无法正确接收

转载 作者:可可西里 更新时间:2023-11-01 02:34:12 26 4
gpt4 key购买 nike

我正在开发一个简单的 TCP 服务器应用程序,它从流中接收数据并将其存储在列表中。

当每个连接在一条消息中发送数据时,我已成功获取数据。我的问题似乎是在从命令行使用 telnet 对其进行测试时。我将开始打字,程序将根据我的打字速度抓取一两个字符,然后不再从该流中接收任何内容。我真的不知道为什么。如果我在 stream.DataAvailable 循环中放置一个 thread.sleep,那么它将获得更多字符,但会再次停止。任何帮助表示赞赏。我的类(class)如下:

public class TCPServer
{
private TcpListener listener;

public List<string> messages;

public TCPServer(IPAddress ip, int port)
{
try
{
messages = new List<string>();

listener = new TcpListener(ip, port);
listener.Start();

listener.BeginAcceptTcpClient(ClientConnected, listener);
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}

private void ClientConnected(IAsyncResult ar)
{

TcpClient client;
try
{
client = listener.EndAcceptTcpClient(ar);
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
return;
}

try
{
NetworkStream stream = client.GetStream();
string message = "";

while (!stream.DataAvailable)
{
}

while (stream.DataAvailable)
{
byte[] readBytes = new byte[65536];
stream.Read(readBytes, 0, readBytes.Length);
message += Encoding.ASCII.GetString(readBytes).TrimEnd('\0');
}

if (message != null)
{
messages.Add(message);
message = "";
}
listener.BeginAcceptTcpClient(ClientConnected, listener);
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}

public void Stop()
{
listener.Stop();
}

}

最佳答案

阅读循环非常不正确。

您误解了 DataAvailable 没有告诉您将到达多少字节。它给你一个下限,可能随时说 0。循环将提前中止。使用 DataAvailable 几乎总是不正确的。

这什么也没做,是一个忙碌的等待,应该向您发出警告:

        while (!stream.DataAvailable)
{
}

正确的阅读方式是简单地调用Read。您需要使用 Read 的返回值来查看已到达的字节数。修剪零是不正确的(你不能那样接收零)和一个 hack,再次,应该在精神上发出危险信号!这不是正确的方法。

套接字很难做到正确。不要进行可疑的黑客攻击,这只会增加不确定性故障的可能性。

关于c# - 动态输入数据时 TCP 服务器无法正确接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35158080/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com