Index: ammosreader/AbstractAmmosReader.py
===================================================================
--- ammosreader/AbstractAmmosReader.py	(revision d2736bb114e7629a177472a95de819bf81393fa4)
+++ ammosreader/AbstractAmmosReader.py	(revision 008dcb7cd6fac15421c533918960563bdb68fd7b)
@@ -13,5 +13,5 @@
     """I implement a base class for specialized AmmosReaders."""
 
-    def __init__(self, file_name):
+    def __init__(self, source):
         """
         I am the standard constructor for Ammos Readers.
@@ -19,21 +19,15 @@
         Additional information about the file can be added as key/value pairs in tags
 
-        :param file_name: The file to read Ammos data from
-        :type file_name: str
+        :param source: The source to read Ammos data from
+        :type source: AmmosSource 
         """
-        self.__file_name = file_name
-        self.__ammos_file = open(self.file_name, "rb")
-        self.__container = AmmosContainer(self.file_name, [])
+        self.__source = source
+        self.__container = AmmosContainer(self.__source.name, [])
         self.__tags = {}
 
     @property
-    def file_name(self):
-        """I return the name of the original file."""
-        return self.__file_name
-
-    @property
-    def ammos_file(self):
-        """I return the file to read the data from."""
-        return self.__ammos_file
+    def source(self):
+        """I return the source of this reader."""
+        return self.__source
 
     @property
@@ -51,8 +45,4 @@
         assert a_key not in self.__tags
         self.__tags[a_key] = a_value
-
-    def rewind_to_start(self):
-        """I set the file pointer to the beginning of the file for the next operation."""
-        self.ammos_file.seek(0)
 
     def read_all_frames_left(self):
@@ -85,5 +75,5 @@
         header_size = AmmosGlobalFrameHeader.HEADER_SIZE
 
-        in_bytes = self.ammos_file.read(header_size)
+        in_bytes = self.__source.read_bytes(header_size)
         logger.info("Reading next global frame header")
         if ((not in_bytes) or (len(in_bytes) < header_size)):
@@ -99,4 +89,8 @@
         return current_global_frame_header
 
+    def read_bytes(self, bytes_to_read):
+        """My descendents have to implement this."""
+        return self.__source.read_bytes(bytes_to_read)
+    
     @abstractmethod
     def read_next_global_frame_body(self, data_header_length):
Index: ammosreader/AmmosAudioFileReader.py
===================================================================
--- ammosreader/AmmosAudioFileReader.py	(revision 008dcb7cd6fac15421c533918960563bdb68fd7b)
+++ ammosreader/AmmosAudioFileReader.py	(revision 008dcb7cd6fac15421c533918960563bdb68fd7b)
@@ -0,0 +1,10 @@
+from ammosreader.AmmosAudioReader import AmmosAudioReader
+
+class AmmosAudioFileReader(AmmosAudioReader):
+
+    def read_bytes(self, bytes_to_read):
+        in_bytes = self.source.read(bytes_to_read)
+        if ((not in_bytes) or (len(in_bytes) < bytes_to_read)):
+            logger.debug("Can not read all %s bytes", bytes_to_read)
+            return None
+        return in_bytes
Index: ammosreader/AmmosAudioReader.py
===================================================================
--- ammosreader/AmmosAudioReader.py	(revision d2736bb114e7629a177472a95de819bf81393fa4)
+++ ammosreader/AmmosAudioReader.py	(revision 008dcb7cd6fac15421c533918960563bdb68fd7b)
@@ -23,5 +23,5 @@
         header_size = AmmosAudioDataHeader.HEADER_SIZE
 
-        in_bytes = self.ammos_file.read(header_size)
+        in_bytes = self.source.read_bytes(header_size)
 
         logger.info("\nReading global frame body standard data header\n")
@@ -40,5 +40,5 @@
         header_size = AmmosExtendedAudioDataHeader.HEADER_SIZE
 
-        in_bytes = self.ammos_file.read(header_size)
+        in_bytes = self.source.read_bytes(header_size)
 
         if ((not in_bytes) or (len(in_bytes) < header_size)):
@@ -65,5 +65,5 @@
         total = number_of_samples*number_of_channels*sample_size
 
-        byte_string = self.ammos_file.read(total)
+        byte_string = self.source.read_bytes(total)
 
         if len(byte_string) != total:
@@ -113,4 +113,3 @@
         :rtype: bytes
         """
-        return (b"".join([each.global_frame_body.data_body.pcm_for_channel(a_channel)
-                          for each in self.container.global_frames]))
+        return self.__container.pcm_for_channel(a_channel)
Index: ammosreader/AmmosAudioSocketReader.py
===================================================================
--- ammosreader/AmmosAudioSocketReader.py	(revision d2736bb114e7629a177472a95de819bf81393fa4)
+++ ammosreader/AmmosAudioSocketReader.py	(revision 008dcb7cd6fac15421c533918960563bdb68fd7b)
@@ -103,5 +103,5 @@
                 ammos_global_header_buffer.append(self.__get_next_data(20))
                 # while len(b''.join(ammos_global_header_buffer)) < 24:
-                #    ammos_global_header_buffer.append(self.__socket.recv(24 - len(b''.join(ammos_global_header_buffer))))
+                #  ammos_global_header_buffer.append(self.__socket.recv(24 - len(b''.join(ammos_global_header_buffer))))
 
                 ammos_global_header = AmmosGlobalFrameHeader.from_bytes(b''.join(ammos_global_header_buffer))
Index: ammosreader/AmmosContainer.py
===================================================================
--- ammosreader/AmmosContainer.py	(revision d2736bb114e7629a177472a95de819bf81393fa4)
+++ ammosreader/AmmosContainer.py	(revision 008dcb7cd6fac15421c533918960563bdb68fd7b)
@@ -56,4 +56,16 @@
                 "\nEnd time  : " + str(end_time) + "\nFrequencies: " + frq)
 
-    def data_only(self):
+    def payload(self):
         return [each.global_frame_body.data_body.data for each in self.__global_frames]
+
+    def pcm_for_channel(self, a_channel):
+        """
+        I return the raw pcm audio data for a given channel.
+
+        :param a_channel: the channel I have to extract
+        :type a_channel: int
+
+        :rtype: bytes
+        """
+        return (b"".join([each.global_frame_body.data_body.pcm_for_channel(a_channel)
+                          for each in self.global_frames]))
Index: ammosreader/AmmosFileSource.py
===================================================================
--- ammosreader/AmmosFileSource.py	(revision 008dcb7cd6fac15421c533918960563bdb68fd7b)
+++ ammosreader/AmmosFileSource.py	(revision 008dcb7cd6fac15421c533918960563bdb68fd7b)
@@ -0,0 +1,15 @@
+from pathlib import Path
+from ammosreader.AmmosSource import AmmosSource
+
+class AmmosFileSource(AmmosSource):
+    def __init__(self, source):
+        self.source = open(source, 'rb')
+        self.name = Path(source).name
+    
+    def read_bytes(self, bytes_to_read):
+        try:
+            in_bytes = self.source.read(bytes_to_read)
+        except Exception as e:
+            print(e)
+            return None
+        return in_bytes
Index: ammosreader/AmmosSocketSource.py
===================================================================
--- ammosreader/AmmosSocketSource.py	(revision 008dcb7cd6fac15421c533918960563bdb68fd7b)
+++ ammosreader/AmmosSocketSource.py	(revision 008dcb7cd6fac15421c533918960563bdb68fd7b)
@@ -0,0 +1,22 @@
+import socket
+
+from ammosreader.AmmosSource import AmmosSource
+
+class AmmosSocketSource(AmmosSource):
+
+    def read_bytes(self, bytes_to_read):
+        byte_array = []
+
+        try:
+            while len(b''.join(byte_array)) < bytes_to_read:
+                logger.info("Remaining Bytes: %s", bytes_to_read - len(b''.join(byte_array)))
+                self.__source.settimeout(5)
+                new_bytes = self.__source.recv(bytes_to_read - len(b''.join(byte_array)), socket.MSG_WAITALL)
+
+                if not new_bytes:
+                    raise TimeoutError("Socket timed out while reading data")
+                logger.info("Got %s bytes of %s remaining", len(new_bytes), bytes_to_read - len(b''.join(byte_array)))
+                byte_array.append(new_bytes)
+        except: TimeOutError:
+            return None
+        return b''.join(byte_array)
Index: ammosreader/AmmosSource.py
===================================================================
--- ammosreader/AmmosSource.py	(revision 008dcb7cd6fac15421c533918960563bdb68fd7b)
+++ ammosreader/AmmosSource.py	(revision 008dcb7cd6fac15421c533918960563bdb68fd7b)
@@ -0,0 +1,42 @@
+from abc import ABC, abstractmethod
+from collections import deque
+
+class AmmosSource(ABC):
+    def __init__(self, source):
+        self.__source = source
+        self.__name = ""
+
+    @property
+    def name(self):
+        return self.__name 
+
+    @name.setter
+    def name(self, a_name):
+        self.__name = a_name
+
+    @property
+    def source(self):
+        return self.__source
+
+    @source.setter
+    def source(self, a_source):
+        self.__source = a_source
+        
+    @abstractmethod
+    def read_bytes(self, bytes_to_read):
+        pass
+
+    def resync(self):
+        magic_word_queue = deque(maxlen=4)
+        while True:
+            try:
+                magic_word_que.append(self.read_bytes(1))
+            except TimeOutError:
+                result = False
+                break
+            byte_array = b''.join(magic_word_queue)
+
+            if byte_array.hex() == AmmosGlobalFrameHeader.MAGIC_WORD:
+                result = True
+                break
+        return result
