我们有从gps设备接收数据的java套接字连接应用程序。现在的问题是,我们有时会收到损坏的数据,并检查设备日志,一切都很好。首先,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);
}
}
}发布于 2012-05-31 16:51:17
这是一个问题。将二进制数据作为文本进行读/写:
这是通过以下方式连接起来的:
字符串与字节之间的桥接方式为:
字节新字符串(bytes,charEncoding)
,
其中charEncoding为可选参数,默认为操作系统编码。
使用UTF-8,Unicode多字节编码,如果做错了,你很快就会陷入麻烦。另外,其他编码也有问题字节。
所以不要使用Reader/Writer。
read()提供了一个int,-1表示文件结束,否则是一个字节值。您的read()测试似乎抛出了一个字节,并且后续的read没有测试-1。
发布于 2012-05-31 17:26:39
目前还不清楚这里使用的是什么字符编码。
当您处理字符流时,显式地提供字符编码来对字节流进行en-/解码几乎总是一个好主意。
在我看来,这很可能是一个字符编码问题。在两端使用相同的编码,使用Reader/Writer就不会有问题。
https://stackoverflow.com/questions/10830116
复制相似问题