使用C#读取TCP流

时间:2015-07-27 21:54:15

标签: c# tcp

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

SELECT @myvar= SUM(Values) FROM myTable

基本上只有许多由换行符分隔的ASCII字符串。 “加载”符号永远不会在chrome中消失。我的第一个目标是获取这些字符串并将它们写入richTexBox。我目前的代码如下:

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

这部分有效。 richTextBox显示前30行左右,但缺少大约200行。我试图增加缓冲区/ byteArray大小和timeoutTime,但在一点之后这不再有用了。 有谁知道如何解决这个问题?

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

祝你好运 阿克塞尔

1 个答案:

答案 0 :(得分:2)

网络传输不是即时的,发送端和接收端都有潜在填充的底层缓冲区(阻止传输),在代码块中记住stm.Read,直到它至少返回1个字节为止,但只返回它可用时可用的数据。在传递缓冲区填满之前,它将阻塞。因此,您必须多次调用它才能读取所有数据。

示例:

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