使用c#读取TCP流

本文关键字:TCP 读取 使用 | 更新日期: 2023-09-27 18:04:54

我正在尝试从TCP端口读取字符串。当用Chrome打开端口时,它看起来是这样的,但是如果有更多行:

I_OH_ALPHA_VANE1 = 1
I_OH_ALPHA_VANE2 = 0
I_MIP_ANTI_SKID_INOP = 0
I_FIRE_APU_BOTTLE_DISCHARGE = 0
I_FIRE_TEST_APU = 0
I_OH_APU_FAULT = 0
I_FIRE_APU = 0
I_OH_APU_GEN_OFF = 0
I_OH_APU_LOW_OIL_PRESSURE = 0
I_OH_APU_MAINT = 0
I_OH_APU_OVERSPEED = 0
I_MIP_ASA_APA_1 = 0
I_MIP_ASA_APA_2 = 0
I_MIP_ASA_APR_1 = 0
I_MIP_ASA_APR_2 = 0
I_MIP_ASA_ATA_1 = 0
I_MIP_ASA_ATA_2 = 0
I_MIP_ASA_ATR_1 = 0
I_MIP_ASA_ATR_2 = 0
I_MIP_ASA_FMC_1 = 0
I_MIP_ASA_FMC_2 = 0
I_ASP_ADF_1_REC = 0
I_ASP_ADF_2_REC = 0
I_ASP2_ADF_1_REC = 0
I_ASP2_ADF_2_REC = 0

它基本上就是许多用换行符分隔的ASCII字符串。"加载"符号永远不会消失在铬。我的第一个目标是获取这些字符串并将它们写入richTexBox。我当前的代码是这样的:

try
{
  int x= 2048;
  TcpClient tcpclnt = new TcpClient();
  tcpclnt.Connect("localhost", 8091);
  // use the ipaddress as in the server program
  Stream stm = tcpclnt.GetStream();
  stm.ReadTimeout = 2000;
  byte[] bb = new byte[x];
  int k = stm.Read(bb, 0, x);
  for (int i = 0; i < k; i++)
  {
    richTextBox2.AppendText(Convert.ToString(Convert.ToChar(bb[i])));
  }
  tcpclnt.Close();
}
catch ( Exception y )
{
  Console.WriteLine("Error..... " + y.StackTrace);
}   

这部分工作。richTextBox显示前30行左右,但大约有200多行不见了。我试图增加buffer/byteArray的大小和timeoutTime,但过了一点,这不再有帮助了。有人知道怎么解吗?

(我对编程很陌生,请不要太难)

致以最亲切的问候阿克塞尔

使用c#读取TCP流

网络传输不是即时的,发送端和接收端都有潜在的缓冲区,往往会填满(阻塞传输),在您的代码块中记住stm.Read,直到它至少有1个字节要返回,但只返回它可用的数据。它将阻塞,直到传入的缓冲区填满。所以你必须多次调用它来读取所有的数据。

的例子:

你调用stm.Read传递2048字节的缓冲区给它。然后服务器开始发送数据,第一个1400字节的块到达,此时你的read调用返回,你的代码继续执行,1毫秒后另一个块到达,但现在你必须再次调用stm.Read来获得它。