2012-10-05 3 views
2

내 Windows 서비스에서 데이터를 TCP 서버로 스트리밍해야합니다. 글로벌 TcpClient 및 NetworkStream을 선언하고 서비스가 시작될 때이를 시작합니다. 30 초마다 약 30-40 개의 문자열 배열을 통해 TCP 서버로 전송합니다.NetworkStream을 사용하여 데이터 보내기

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 초, I는 문자열이 하나 개의 패킷마다 전송 될 것인지이다.

그래서 NetworkStream.write 메서드를 사용하여 패킷을 즉시 보내려면 어떻게해야합니까? send 메소드 (매분 약 60 회)를 호출 할 때마다 새 TCPClient와 NetworkStream을 선언하면 데이터가 별도로 전송되지만 아주 좋은 솔루션은 아닙니다. NetworkStream.flush를 시도했지만 작동하지 않았습니다.

답변

3

TcpClient의 NoDelay propertytrue으로 설정해야합니다. NoDelay가 false 때 나가는 상당한 양의 데이터를 수집 할 때까지

는하여 TcpClient는 네트워크를 통해 패킷을 전송하지 않습니다. TCP 세그먼트의 오버 헤드로 인해 작은 양의 데이터를 보내는 것은 비효율적입니다. 그러나 은 매우 적은 양의 데이터를 보내거나 보내려는 각 패킷에서 즉각적인 응답을 기대해야하는 상황이 있습니다 ( ).

스트림으로 배치 했으므로 스트림을 즉시 플러시해야합니다.

+0

감사합니다. – mdc

관련 문제