我試圖創建一個自包含的類,它維護到服務器的TCP連接。TcpClient BottleNeck
我使用下列類變量:
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 ()等,根據服務器協議。
這裏是接收器線程:
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中)?
這實際上是我第一次嘗試網絡編程,所以任何建議都會非常有幫助。
謝謝。
稍候...你不能只從BinaryReader在讀取的MReader整數直?爲什麼你需要一個ByteBuffer消息? BinaryReader文檔:http://msdn.microsoft.com/en-us/library/system.io.binaryreader.aspx –
我相信服務器使用big-endian,而BinaryReader使用little-endian。或者以其他方式。我不記得哪個。 – jjw
好的。如果是這樣的話,那麼我沒有看到你正在做的事情有什麼錯誤。如果你想保持這個單線程,我建議使用一個Profiler來幫助找出放慢速度的地方。如果你的MessageProcessor。進程(消息)需要一些處理時間,我建議去多線程。 –