使用NetworkStream发送数据

时间:2012-10-05 16:16:38

标签: c# tcpclient networkstream

在我的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方法立即发送数据包呢?如果我每次调用send方法(大约每分钟60次)时都声明一个新的TCPClient和NetworkStream,那么数据会单独发送,但这不是一个非常好的解决方案。我试过NetworkStream.flush,但那不起作用..

1 个答案:

答案 0 :(得分:3)

您应该将TcpClient上的NoDelay property设置为true;

  

当NoDelay为false时,TcpClient不发送数据包   网络,直到它收集了大量的传出数据。   由于TCP段中的开销量很大,发送量很小   数据量低效。但是,您遇到的情况确实存在   需要发送非常少量的数据或期望立即响应   来自您发送的每个数据包。

由于您将其包装在流中,您可能仍需要刷新流以立即发送。