在我的windows服务中,我需要将数据流式传输到tcp服务器。我声明了一个全局TcpClient和NetworkStream,并在服务启动时启动它们。每隔30秒,我会遍历一个由大约30-40个字符串组成的数组,并将其发送到tcp服务器。
send方法如下所示:
private void sendMessage(string message)
{
Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
Globals._stream.Write(data, 0, data.Length);
if (Globals._responseEnabled)
{
data = new Byte[256];
String responseData = String.Empty;
Int32 bytes = Globals._stream.Read(data, 0, data.Length);
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
if (Globals._logStream)
Globals._el.writeEventToWindowsLog("Received: " + responseData, "Info");
}
}问题是,每30秒只有几个数据包与所有字符串组合在一起发送,我希望字符串发送在每个数据包中。
那么,如何让NetworkStream.write方法立即发送数据包呢?如果我在每次调用TCPClient方法时声明一个新的NetworkStream和send (大约每分钟60次),那么数据将被分开发送,但这不是一个很好的解决方案。我试过NetworkStream.flush,但不起作用..
发布于 2012-10-06 00:25:32
您应该将TcpClient上的NoDelay property设置为true;
当NoDelay为false时,TcpClient在收集了大量传出数据之前不会通过网络发送数据包。由于TCP数据段中的大量开销,发送少量数据的效率很低。但是,确实存在这样的情况:您需要发送非常少量的数据,或者希望您发送的每个数据包都能立即得到响应。
由于您将其包装在流中,因此您可能仍然需要刷新流才能立即发送。
https://stackoverflow.com/questions/12750209
复制相似问题