gpt4 book ai didi

c# - TcpClient 瓶颈

转载 作者:太空宇宙 更新时间:2023-11-03 14:13:33 29 4
gpt4 key购买 nike

我正在尝试创建一个独立的类来维护与服务器的 Tcp 连接。

我正在使用以下类变量:

TcpClient tcpClient;
NetworkStream networkStream;
BinaryReader mReader;
BinaryWriter mWriter;

并使用以下代码初始化它们:

tcpClient = new TcpClient(host, 443);
networkStream = tcpClient.GetStream();
mReader = new BinaryReader(networkStream);
mWriter = new BinaryWriter(networkStream);

receiveMessage = new Thread(new ThreadStart(ReceiveMessages));
receiveMessage.Start();

我正在使用阻塞调用进行读取。来自服务器的每个数据包都带有 4 个字节(一个 int)作为前缀,它定义了确切的数据包大小。我正在使用我编写的一个名为 ByteBuffer 的类,它有一个 List(Byte) 来存储字节一旦进入。该类具有使用 ReadInt()、ReadString 从字节列表顶部拉出整数和其他类型的函数() 等,根据服务器协议(protocol)。

这是接收器线程:

private void ReceiveMessages()
{
while (tcpClient.Connected)
{
if (tcpClient.Available >= 4)
{
try
{
ByteBuffer message = new ByteBuffer();
message.AddBytes(mReader.ReadBytes(4));
int mSize = message.ReadInt();
message.AddBytes(mReader.ReadBytes(mSize - 4));
MessageProcessor.Process(message);
}
catch (Exception ex)
{
Print(ex.Message);
}
}
Thread.Sleep(1);
}
Print("Receiver thread terminated.");
Reconnect();
}

作为引用,MessageProcessor 是一个静态类,它查看数据包信息并适本地响应服务器。

我的问题是,当连接上的流量开始变得非常高时,响应开始明显延迟。我想知道,就 tcp 连接而言,我做错了什么吗?我应该尝试编写该类的异步版本吗? C# List 对象是否太慢以至于无法如此频繁地使用(在 ByteBuffer 中)?

这真的是我第一次尝试网络编程,所以任何建议都会非常有帮助。

谢谢。

最佳答案

我会像这样重写您的 ReceiveMessages 方法删除坏的 Thread.Sleep。使用更快的字节数组。

就像@jgauffin 所说的那样,异步网络代码要好得多,但更容易搞砸。如果您刚刚开始网络编程,最好保持简单。

我希望这对你更好。

注意消息没有 4 字节 header

private void ReceiveMessages()
{

while (tcpClient.Connected) {
try {

var networkstream = tcpClient.GetStream();
var header = new byte[4];
networkstream.Read(header, 0, 4);

int len = 0;
// calculate length from header
// Do reverse for BigEndian, for little endian remove
Array.Reverse(header);
len = BitConverter.ToInt32(header, 0);

var message = new byte[len];
networkstream.Read(message, 0, message.Length);

// Process message

}
catch (Exception ex)
{
Print(ex.Message);
// Exit loop something went wrong
break;
}
}

Print("Receiver thread terminated.");
Reconnect();

}

关于c# - TcpClient 瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7098248/

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