2017-06-21 13 views
0

Iシリアル通信(RXTXCommライブラリ)を使用してファイルを送受信するサーバー/クライアントJAVAアプリケーションを作成しました。
私のプロジェクトのために、送信の途中でリンクが物理的に切断される可能性があるので、ネットワークが再確立された後、送信を再開するスライディングウィンドウと接続リセットコードを実装しました。シリアル接続のリセットビットが間違っています

問題は、接続が切断されて再確立された後にデータを受信し、あるが

Serverコード「レシーバー」破損している:

bytesRead = in.read(mybytearray, 0, mybytearray.length); 
System.out.println("R\t Bytes read\t" + bytesRead); 
current = bytesRead; 
System.out.println("R\t\t FIRST Last byte recieved \t" + current); 
outR.writeLong((current + 1)); 
outR.flush(); 
System.out.println("R\t\tSending ACK"); 

while (true) { 
    do { 
     bytesRead = in.read(mybytearray, current, (mybytearray.length - current)); 
     System.out.println("R\t Bytes read\t" + bytesRead); 
     if (bytesRead >= 0) current += bytesRead; 
     System.out.println("R\t\tLast byte recieved \t" + current); 
     //ACK = Integer.toString((current+1)); 
     outR.writeLong((current + 1)); 

     outR.flush(); 
     System.out.println("R\t\tSending ACK"); 

    } while (bytesRead > 0); 
    //in.close(); 

    if ((mybytearray[current - 1] & 0xff) != 0b01000101) { 
     int timer = 0; 
     boolean loop = true; 
     while (loop) { 
      timer++; 
      Thread.sleep(1000); 
      if (timer > 5) { 

       System.out.println("R\t\t Connection Timeout"); 
       timer = 0; 
       current = 0; 
       break; 
      } 
     } 
    } else { 
     break; 
    } 
} 
bos.write(mybytearray, 0, current - 1); 
bos.flush(); 
System.out.println("R\t\tfinished recieving"); 
bos.close(); 

、これはクライアントの「送信者」

です
public static class InReciever implements Runnable { 
    DataInputStream inS; 
    public InReciever(DataInputStream in) { 
     inS = in; 
    } 

    @Override 
    public void run() { 
     try { 
      //int timer=0; 
      while (true) { 
       long ack = 0; 

       if (brek) 
        break; 
       if ((ack = inS.readLong()) > 0) { 

        firstACK = false; 
        windowStart = ack; 

        System.out.println("S\t\tRecieving ack"); 
        System.out.println("S\tNext byte to send\t" + ack); 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public static class SerialWriter implements Runnable { 
    OutputStream out; 
    DataInputStream inS; 
    DataOutputStream outHello; 
    byte[] mybytearray; 

    public SerialWriter(OutputStream out, DataInputStream in, DataOutputStream outHello, byte[] buffer) { 
     this.out = out; 
     inS = in; 
     this.outHello = outHello; 
     mybytearray = buffer; 
    } 

    public void run() { 
     try { 
      new Thread(new InReciever(inS)).start(); 
      for (int i = 0; i < mybytearray.length; i++) { 
       //System.out.println("windowEnd \t"+windowEnd); 
       out.write(mybytearray[i]); 
       out.flush(); 
       int timer = 0; 
       while (windowEnd > (windowStart + 2000) && !firstACK) { 
        timer++; 
        Thread.sleep(1000); 

        if (timer > 5) { 
         System.out.println("S\tTimeout \n Restart connection \t"); 
         i = -1; 
         out.flush(); 
         windowStart = 0; 
         windowEnd = 0; 
         firstACK = true; 
        } 
        //Thread.sleep(100); 
        // 
       } 
       windowEnd++; 
      } 
      outHello.writeChar('E'); 
      outHello.flush(); 
      System.out.println("s\tfinished sending"); 
      brek = true; 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

答えて

0

私はコードの各行を分析していませんが、私が見ていないのは検証の形式です。シリアル通信は、通常、パケットチェックなどの多くの形式の検証を使用します。

ストリームを小さなチャンクに分割し、一度にチャンクを送信しようとしましたか?送信者は、受信者が確認できる各チャンクでいくつかのタイプのCRCチェックサム計算を含める必要があります。

割り込みが再開された後、受信者はCRCチェックサムで最新のチャンクを検証します。一致しない場合は、チャンクを破棄し、中断した箇所から再開します。

あなたの「再起動」コードが破損ビットを適切に破棄しないことが疑わしいです。

関連する問題