我正在尝试创建一个自包含的类,它维护与服务器的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从字节列表顶部提取整数和其他类型的函数()等,根据服务器协议。
这是Receiver线程:
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中)?
这是我第一次尝试网络编程,因此任何建议都会非常有用。
感谢。
答案 0 :(得分:1)
我会像这样重写你的ReceiveMessages方法 删除Thread.Sleep是坏的。使用更快的字节数组。
像@jgauffin一样,Async网络代码要好得多,但更容易搞砸。如果您刚开始使用网络编程,请更好地保持简单。
我希望这对你有用。
注意消息没有4字节标题
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();
}
答案 1 :(得分:0)
转而使用异步处理。使用线程和Thread.Sleep
是邪恶的。
查看Socket.BeginReceive或您的NetworkStream.BeginRead
您还可以使用我的新库:http://blog.gauffin.org/2012/05/griffin-networking-a-somewhat-performant-networking-library-for-net/