0

我们有 java 套接字连接应用程序,它从 gps 设备接收数据。现在的问题有时我们收到损坏的数据并在设备日志上检查一切都很好。First BufferedReader 被使用并被怀疑是罪魁祸首。我们搬到 inpustream 也仍然有问题。损坏是随机的,而不是固定的时间间隔。下面是代码片段。

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)
  • 新的 OutputStreamWriter(outputStream, charEncoding)

并且字符串到字节由以下方式桥接:

  • 新字符串(字节,字符编码)
  • string.getBygtes(charEncoding)

其中 charEncoding 是可选参数,默认为操作系统编码。

使用 UTF-8,Unicode 多字节编码,如果做错了,你很快就会陷入困境。其他编码也有问题的字节。

所以不要使用 Reader/Writer。

read()传递一个 int,-1 表示文件结束,否则传递一个字节值。似乎您使用 read() 进行的测试会抛出一个字节,并且随后的读取不会测试 -1。

于 2012-05-31T08:51:17.470 回答
0

不清楚这里使用什么字符编码。

当您处理字符流时,显式提供字符编码以对字节流进行编码/解码几乎总是一个好主意。

在我看来,这很可能是字符编码问题。两边使用相同的编码,读写器不会有问题。

于 2012-05-31T09:26:38.553 回答