2017-10-17 8 views
1

前に聞いたことがあるのですが、申し訳ありません。TCPからデータが失われないようにする方法を教えてください。

私は、TCP経由で受信したデータを読み込み、StreamReaderを使用してプログラムを開発しています。データが失われないようにする方法を見つけることができません。そこから読み込む中間のバッファを作成する方法はありますか?

ここでは、テキストボックスにデータを受信し、それを書くために私が作成したメソッドです:

public static void Connect(string IP, string port)   
{ 
    try 
    { 
     client = new TcpClient(); 
     IPEndPoint IP_End = new IPEndPoint(IPAddress.Parse(IP), int.Parse(port)); 
     client.Connect(IP_End); 
     if (client.Connected) 
     { 
      connected = "Connected to Exemys!" + "\r\n"; 
      STR = new StreamReader(client.GetStream()); 
      bgWorker = true; 
     } 
    } 
    catch (Exception x) 
    { 
     MessageBox.Show(x.Message.ToString()); 
    } 
} 

-

public static void MessageReceiving(TextBox textBox) 
{ 
    try 
    { 
     string values =Conection.STR.ReadLine(); 
     textBox.Invoke(new MethodInvoker(delegate() { textBox.AppendText("Exemys : " + values.Substring(2) + Environment.NewLine); })); 
     try 
     { 
      string messagetype = values.Substring(5, 1); 
      string ID = values.Substring(3, 2); 
      string checksum = values.Substring(values.Length - 2, 2); 
      if (checksum == CalcularChecksum(values.Substring(3, values.Length - 5))) 
      { 
       if (messagetype == "N") 
       { 
        if (ID == "01") 
        { 
         ID1 = values.Substring(3, 2); 
         messagetype1 = values.Substring(5, 1); 
         capacity1 = values.Substring(6, 1); 
         pressure1 = values.Split(',')[1]; 
         sequencetime1 = values.Split(',')[2]; 
         runstatus1 = values.Split(',')[3]; 
         mode1 = values.Split(',')[4].Substring(0, 1); 
         checksum1 = CalcularChecksum(values.Substring(3, values.Length - 5)); 
        } 
        if (ID == "02") 
        { 
         ID2 = values.Substring(3, 2); 
         messagetype2 = values.Substring(5, 1); 
         capacity2 = values.Substring(6, 1); 
         pressure2 = values.Split(',')[1]; 
         sequencetime2 = values.Split(',')[2]; 
         runstatus2 = values.Split(',')[3]; 
         mode2 = values.Split(',')[4].Substring(0, 1); 
         checksum2 = CalcularChecksum(values.Substring(3, values.Length - 5)); 
        } 
       } 
      } 

     } 
     catch(Exception x) 
     { 
      MessageBox.Show(x.Message.ToString()); 
     } 
    } 
    catch (Exception) 
    { 
     MessageBox.Show("Client disconnected."); 
    } 
} 

編集:私が尋ねるしようとしていることはどのようにあります受信を続ける前に常にデータ全体を処理してください。それが問題になるでしょう。

+0

制御バイトを追加します。例えば。 32バイト/ 64バイトごとに2バイト増加します。彼らがそこにいないなら、何かが欠けている。 – i486

答えて

1

TCPストリームは、ネットワークの問題のために、ソケットがあなたまたはリモートピアによって閉じられたり、切断されたときに終了するバイトのストリームです。ストリームからすべてを取得するには、ループ内でStreamReader.ReadLineメソッドを呼び出して、何らかの停止条件が適用されるまでバッファに入れる必要があります。

... 
try 
{ 
    while(true) 
    { 
     ... 
     input = STR.ReadLine(); 
     if (input == <some stop condition>) 
      break; 
     ... 
    } 
} 
... 

これは非常に単純化された例です。部分的なバッファ処理を伴うTCPの読み込みは複雑なビーストになる可能性がありますので、いくつかのホビープロジェクト以上のことをしている場合は、ライブラリやフレームワークを使用することをお勧めします。

0

返信ありがとうございますが、検索した後、私が探していたものを見つけました。私はそれらを失わないことを確かめるために入力したメッセージ(データ)を保存したがっています(何らかの理由で、受信プロセスがメッセージ処理操作よりも高速であることをより正確に)ため、これを達成するためにQueue

public static void RecepcionMensajes(TextBox textBox) 
    { 
     if (client.Connected == true) 
     { 
      try 
      { 
       string fifo = Conexion.STR.ReadLine(); 
       Queue mensajes = new Queue(); 
       //Aquí se ponen en cola los mensajes que van llegando, utilizando el sistema FIFO. 
       mensajes.Enqueue(fifo); 
       string values = mensajes.Dequeue().ToString(); 
       textBox.Invoke(new MethodInvoker(delegate() { textBox.AppendText("Exemys : " + values.Substring(2) + Environment.NewLine); })); 
関連する問題