0

GPSデバイスからデータを受信するJavaソケット接続アプリケーションがあります。問題は、破損したデータを受け取り、デバイスのログをチェックして、すべてが正常である場合があります。最初のBufferedReaderが使用され、原因であると疑われました。私たちはインプストリームに移動しましたが、まだ問題があります。破損はランダムであり、固定間隔ではありません。以下はコードのスニペットです。

public void run() { 

     String completeMessage="";
     //BufferedReader readerBuffer = null; 
     InputStream is = null;    
     BufferedWriter writeBuffer = null;

     try {
         //readerBuffer = new BufferedReader(new InputStreamReader(sockConn1.getInputStream()));
         is = sockConn1.getInputStream();
         writeBuffer = new BufferedWriter(new OutputStreamWriter(sockConn1.getOutputStream()));

         int readChar=0;         

         sockConn1.setSoTimeout(120000);
         //dbConnection = connectionPool.getConnection();
         //dbConnection.setAutoCommit(false);
           int readChar
            while ((readChar=is.read()) != -1) 
             {                

                 System.out.println("Char value: "+(char)readChar) ;
                  if (readChar == '*') {
                   try {

                     //writeBuffer.write("@@\r\n\r\n");
                     //writeBuffer.flush();                 
                     //db processing
                    dbConnection.commit();
                   }
                   catch (SQLException ex){ 
                         ex.printStackTrace();
                            try{    
                            dbConnection.rollback();  
                            } 
                            catch (Exception rollback){    
                                rollback.printStackTrace();
                            }
                  }
                  catch (Exception e){
                        e.printStackTrace(System.out);
                            try{    
                            dbConnection.rollback();  
                            } 
                            catch (Exception rollback){    
                                rollback.printStackTrace(System.out);
                            }
                  }
                  finally{
                        try{
                            if ( dbStmt != null ){
                              dbStmt.close();
                            }                           
                        }
                        catch(SQLException ex){
                            ex.printStackTrace(System.out);
                        }                      
                      }      
                completeMessage="";           
                }

             }
          }
          catch (SocketTimeoutException ex){ 
               ex.printStackTrace();
          }  
          catch (IOException ex){ 
               ex.printStackTrace();
          }  
          catch (Exception ex){ 
               ex.printStackTrace();
          }      
          finally{
            try{
                if ( dbConnection != null ){
                  dbConnection.close();
                }
            }
            catch(SQLException ex){
                 ex.printStackTrace();
            }
            try{
                if ( writeBuffer != null ){
                    writeBuffer.close();
                }
            }
            catch(IOException ex){
               ex.printStackTrace(System.out);
            }           
          }

      }
4

2 に答える 2

1

問題がある。バイナリデータをテキストとして読み取り/書き込みします。

  • InputStream、OutputStream=バイナリデータ
  • リーダー、ライター=テキスト

これは以下によって橋渡しされます:

  • 新しいInputStremReader(inputStream、charEncoding)
  • new OutputStreamWriter(outputStream、charEncoding)

そして、文字列からバイトへのブリッジは次のように行われます。

  • 新しい文字列(バイト、charEncoding)
  • string.getBygtes(charEncoding)

ここで、charEncodingはオプションのパラメーターであり、デフォルトではオペレーティングシステムのエンコーディングになります。

UnicodeマルチバイトエンコーディングであるUTF-8を使用すると、間違って実行するとすぐに問題が発生します。また、他のエンコーディングには問題のあるバイトがあります。

したがって、Reader/Writerは使用しないでください。

read()intを配信し、ファイルの終わりの場合は-1、それ以外の場合はバイト値を配信します。read()を使用したテストでは、1バイトが破棄され、後続の読み取りでは-1がテストされないようです。

于 2012-05-31T08:51:17.470 に答える
0

ここで使用されている文字エンコーディングは明確ではありません。

文字ストリームを扱う場合、ほとんどの場合、文字エンコーディングを明示的に指定してバイト ストリームをエンコード/デコードすることをお勧めします。

私の意見では、ここでは文字エンコーディングの問題である可能性が最も高いです。両側で同じエンコーディングを使用すると、リーダー/ライターで問題が発生することはありません。

于 2012-05-31T09:26:38.553 に答える