我们有一个Java套接字连接应用程序,可以从gps设备接收数据。现在的问题有时是我们收到损坏的数据并在设备上检查日志时,一切都很好。首先使用了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);
}
}
}
最佳答案
这儿存在一个问题。您将二进制数据读/写为文本:
InputStream,OutputStream =二进制数据
读者,作家=文字
这是通过:
新的InputStremReader(inputStream,charEncoding)
新的OutputStreamWriter(outputStream,charEncoding)
字符串到字节的桥接方式是:
新的String(bytes,charEncoding)
string.getBygtes(charEncoding)
其中charEncoding是可选参数,默认为操作系统编码。
使用UTF-8(Unicode多字节编码),如果做错了,很快就会遇到麻烦。另外,其他编码的字节也有问题。
因此,请勿使用阅读器/书写器。read()
传递一个int,文件末尾为-1,否则为字节值。
似乎使用read()进行的测试会丢掉一个字节,而后续的读取不会测试-1。