diff options
author | Björn Hagemeister | 2014-07-10 14:09:16 +0200 |
---|---|---|
committer | Björn Hagemeister | 2014-07-10 14:09:16 +0200 |
commit | 2c0f86d04457526375062eeb4a495bd9ac864bd7 (patch) | |
tree | 7a5f5587827da73e824eb6b5bc09b8b996b1c799 /src/main/java/org/openslx/filetransfer | |
parent | Serveral changes, made hex code for recongnizing what to do as member. (diff) | |
download | master-sync-shared-2c0f86d04457526375062eeb4a495bd9ac864bd7.tar.gz master-sync-shared-2c0f86d04457526375062eeb4a495bd9ac864bd7.tar.xz master-sync-shared-2c0f86d04457526375062eeb4a495bd9ac864bd7.zip |
Fixed handling with constant byte[] - length while reading and writing from/to socket.
Plus startet implementing correct Exception handling.
Diffstat (limited to 'src/main/java/org/openslx/filetransfer')
4 files changed, 63 insertions, 21 deletions
diff --git a/src/main/java/org/openslx/filetransfer/ClassTest.java b/src/main/java/org/openslx/filetransfer/ClassTest.java index b53c7bf..14fa519 100644 --- a/src/main/java/org/openslx/filetransfer/ClassTest.java +++ b/src/main/java/org/openslx/filetransfer/ClassTest.java @@ -31,8 +31,18 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; +import org.apache.log4j.BasicConfigurator; +import org.slf4j.LoggerFactory; + public class ClassTest { + static { + // This is a temporary workaround for this annoying log4j error msg. + // Initializing the logger before anything else is done. + BasicConfigurator.configure(); + LoggerFactory.getLogger( "ROOT" ); + } + public static void main( String[] args ) throws Exception { String pathToKeyStore = diff --git a/src/main/java/org/openslx/filetransfer/Downloader.java b/src/main/java/org/openslx/filetransfer/Downloader.java index 2603a65..4c132e6 100644 --- a/src/main/java/org/openslx/filetransfer/Downloader.java +++ b/src/main/java/org/openslx/filetransfer/Downloader.java @@ -5,12 +5,15 @@ import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; +import java.net.SocketTimeoutException; import java.nio.charset.StandardCharsets; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; +import org.apache.log4j.Logger; + public class Downloader { // Some instance variables. @@ -22,6 +25,8 @@ public class Downloader private String RANGE = null; private String outputFilename = null; private String ERROR = null; + + private static Logger log = Logger.getLogger( Downloader.class ); /***********************************************************************/ /** @@ -212,7 +217,7 @@ public class Downloader // First get length. dataFromServer.read( incoming, 0, 1 ); int length = incoming[0]; - System.out.println( "length: " + length ); + System.out.println( "length (downloader): " + length ); if ( length == 0 ) break; @@ -255,6 +260,11 @@ public class Downloader return false; } } + } catch (SocketTimeoutException ste) { + ste.printStackTrace(); + sendErrorCode("timeout"); + log.info( "Socket Timeout occured in Downloader." ); + this.close(); } catch ( Exception e ) { e.printStackTrace(); return false; @@ -269,29 +279,41 @@ public class Downloader */ public Boolean readBinary() { + RandomAccessFile file = null; try { int length = getDiffOfRange(); byte[] incoming = new byte[ 4000 ]; // TODO: größe Problematisch, abchecken. int hasRead = 0; + file = new RandomAccessFile( new File( outputFilename ), "rw" ); + file.seek( getStartOfRange() ); while ( hasRead < length ) { - int ret = dataFromServer.read( incoming, hasRead, length - hasRead ); + int ret = dataFromServer.read( incoming, 0, Math.min( length - hasRead, incoming.length ) ); if ( ret == -1 ) { System.out.println( "Error occured in Downloader.readBinary()," + " while reading binary." ); return false; } hasRead += ret; - } + file.write( incoming, 0, ret ); - RandomAccessFile file; - file = new RandomAccessFile( new File( outputFilename ), "rw" ); - file.seek( getStartOfRange() ); - file.write( incoming, 0, length ); - file.close(); + } + } catch ( SocketTimeoutException ste ) { + ste.printStackTrace(); + sendErrorCode( "timeout" ); + log.info( "Socket timeout occured in Downloader." ); + this.close(); } catch ( Exception e ) { e.printStackTrace(); return false; + } finally { + if (file != null) { + try { + file.close(); + } catch ( IOException e ) { + e.printStackTrace(); + } + } } return true; } @@ -311,6 +333,7 @@ public class Downloader dataToServer.write( data ); } catch ( IOException e ) { e.printStackTrace(); + this.close(); return false; } return true; @@ -325,6 +348,8 @@ public class Downloader { try { this.satelliteSocket.close(); + if (dataFromServer != null) dataFromServer.close(); + if (dataToServer != null) dataToServer.close(); } catch ( IOException e ) { e.printStackTrace(); } diff --git a/src/main/java/org/openslx/filetransfer/Listener.java b/src/main/java/org/openslx/filetransfer/Listener.java index 1092aa1..f00f4bc 100644 --- a/src/main/java/org/openslx/filetransfer/Listener.java +++ b/src/main/java/org/openslx/filetransfer/Listener.java @@ -25,13 +25,6 @@ public class Listener extends Thread private static Logger log = Logger.getLogger( Listener.class ); - static { - // This is a temporary workaround for this annoying log4j error msg. - // Initializing the logger before anything else is done. - BasicConfigurator.configure(); - LoggerFactory.getLogger( "ROOT" ); - } - /***********************************************************************/ /** * Constructor for class Listener, which gets an instance of IncomingEvent. @@ -66,7 +59,7 @@ public class Listener extends Thread byte[] b = new byte[ 1 ]; int length = connectionSocket.getInputStream().read( b ); - System.out.println( length ); + System.out.println( "Length (Listener): " + length ); if ( b[0] == U ) { log.info( "recognized U --> starting Downloader" ); // TODO: Use Logger (see masterserver code for example) diff --git a/src/main/java/org/openslx/filetransfer/Uploader.java b/src/main/java/org/openslx/filetransfer/Uploader.java index 84e48e7..26f8879 100644 --- a/src/main/java/org/openslx/filetransfer/Uploader.java +++ b/src/main/java/org/openslx/filetransfer/Uploader.java @@ -5,6 +5,7 @@ import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; +import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; import java.security.KeyManagementException; @@ -16,6 +17,8 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; +import org.apache.log4j.Logger; + public class Uploader { // Some member variables. @@ -27,6 +30,8 @@ public class Uploader private String RANGE = null; private String ERROR = null; + private static Logger log = Logger.getLogger( Uploader.class ); + /***********************************************************************/ /** * Constructor for satellite uploader. @@ -92,6 +97,7 @@ public class Uploader dataToServer.write( data ); } catch ( IOException e ) { e.printStackTrace(); + return false; } return true; @@ -202,7 +208,7 @@ public class Uploader // First get length. dataFromServer.read( incoming, 0, 1 ); - int length = incoming[0]; + int length = incoming[0] & 0xFF; // System.out.println("length: " + length); if ( length == 0 ) // Stop if 0 was read. @@ -245,7 +251,12 @@ public class Uploader return false; } } - } catch ( IOException e ) { + } catch (SocketTimeoutException ste) { + ste.printStackTrace(); + sendErrorCode("timeout"); + log.info( "Socket Timeout occured in Downloader." ); + this.close(); + } catch ( Exception e ) { e.printStackTrace(); return false; } @@ -274,7 +285,7 @@ public class Uploader int length = getDiffOfRange(); System.out.println( "diff of Range: " + length ); while ( hasRead < length ) { - int ret = file.read( data, hasRead, length - hasRead ); + int ret = file.read( data, 0, Math.min( length - hasRead, data.length ) ); if ( ret == -1 ) { System.out.println( "Error occured in Uploader.sendFile()," + " while reading from File to send." ); @@ -282,10 +293,10 @@ public class Uploader return false; } hasRead += ret; + dataToServer.write( data, 0, ret ); } file.close(); - dataToServer.write( data, 0, length ); } catch ( Exception e ) { e.printStackTrace(); return false; @@ -308,6 +319,7 @@ public class Uploader dataToServer.write( data ); } catch ( IOException e ) { e.printStackTrace(); + this.close(); return false; } return true; @@ -315,13 +327,15 @@ public class Uploader /***********************************************************************/ /** - * Method for closing connection, if download has finished. + * Method for closing connection, if upload has finished. * */ public void close() { try { this.satelliteSocket.close(); + if (dataFromServer != null) dataFromServer.close(); + if (dataToServer != null) dataToServer.close(); } catch ( IOException e ) { e.printStackTrace(); } |