title: Streaming audio from microphone with Java
body: <p>I'm developing a project which requires me to stream audio from microphone from a client to a server.  The code shown below is what I have written. When I run both the client and server code the audio is not streamed live. In fact the audio from the client is stored in the buffer and when I terminate the execution of the client side code the audio from the buffer on the server gets output to the speaker. What am I doing wrong? (I'm developing on eclipse)</p>
  
  <p><strong>server:</strong></p>
  
  <pre><code>import java.io.DataOutputStream;
  import java.io.IOException;
  import java.net.ServerSocket;
  import java.net.Socket;
  
  import javax.sound.sampled.AudioFormat;
  import javax.sound.sampled.AudioSystem;
  import javax.sound.sampled.DataLine;
  import javax.sound.sampled.TargetDataLine;
  
  //import org.apache.commons.io.output.ByteArrayOutputStream;
  
  
  public class ServerStream {
      private OutgoingSoudnListener osl = new OutgoingSoudnListener();
      boolean outVoice = true;
      AudioFormat format = getAudioFormat();
      private ServerSocket serverSocket;
      Socket server;
  
  
      private AudioFormat getAudioFormat() {
          float sampleRate = 16000.0F;
          int sampleSizeBits = 16;
          int channels = 1;
          boolean signed = true;
          boolean bigEndian = false;
  
          return new AudioFormat(sampleRate, sampleSizeBits, channels, signed, bigEndian);
      }
      public ServerStream() throws IOException{
          try{
              System.out.println("Creating Socket...");
              serverSocket = new ServerSocket(3000);
              osl.runSender();
          }catch(Exception e){
              e.printStackTrace();
          }
      }
      class OutgoingSoudnListener{
          public void runSender(){
              try{
                  server = serverSocket.accept();
                  System.out.println("Listening from mic.");
                  DataOutputStream out = new DataOutputStream(server.getOutputStream());
                  DataLine.Info micInfo = new DataLine.Info(TargetDataLine.class,format);
                  TargetDataLine mic = (TargetDataLine) AudioSystem.getLine(micInfo);
                  mic.open(format);
                  System.out.println("Mic open.");
                  byte tmpBuff[] = new byte[mic.getBufferSize()/5];
                  mic.start();
                  while(outVoice) {
                      System.out.println("Reading from mic.");
                      int count = mic.read(tmpBuff,0,tmpBuff.length);
                      if (count &gt; 0){
                          System.out.println("Writing buffer to server.");
                          out.write(tmpBuff, 0, count);
                      }               
                      }
                  mic.drain();
                  mic.close();
                  System.out.println("Stopped listening from mic.");
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
  
      }
      public static void main (String args[]) throws IOException{
          new ServerStream();
  
      }
  
  
  }
  </code></pre>
  
  <p><strong>client:</strong></p>
  
  <pre><code>import java.io.ByteArrayInputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.net.Socket;
  
  
  import javax.sound.sampled.AudioFormat;
  import javax.sound.sampled.AudioInputStream;
  import javax.sound.sampled.AudioSystem;
  import javax.sound.sampled.DataLine;
  import javax.sound.sampled.SourceDataLine;
  
  import org.apache.commons.io.IOUtils;
  
  public class ClientStream{
  
      public ClientStream() throws IOException{
          isl.runListener();
      }
  
      private IncomingSoundListener isl = new IncomingSoundListener();    
      AudioFormat format = getAudioFormat();
      InputStream is;
      Socket client;
      String serverName = "192.168.2.8";
      int port=3000;
      boolean inVoice = true;
  
  
      private AudioFormat getAudioFormat(){
          float sampleRate = 16000.0F;
          int sampleSizeBits = 16;
          int channels = 1;
          boolean signed = true;
          boolean bigEndian = false;
  
          return new AudioFormat(sampleRate, sampleSizeBits, channels, signed, bigEndian);
      }
      class IncomingSoundListener {
          public void runListener(){
              try{
                  System.out.println("Connecting to server:"+serverName+" Port:"+port);
                  client = new Socket(serverName,port); 
                  System.out.println("Connected to: "+client.getRemoteSocketAddress());
                  System.out.println("Listening for incoming audio.");
                  DataLine.Info speakerInfo = new DataLine.Info(SourceDataLine.class,format);
                  SourceDataLine speaker = (SourceDataLine) AudioSystem.getLine(speakerInfo);
                  speaker.open(format);
                  speaker.start();
                  while(inVoice){
                      is = client.getInputStream();
                      byte[] data = IOUtils.toByteArray(is);  
                      ByteArrayInputStream bais = new ByteArrayInputStream(data);
                      AudioInputStream ais = new AudioInputStream(bais,format,data.length);
                      int bytesRead = 0;
                      if((bytesRead = ais.read(data)) != -1){
                          System.out.println("Writing to audio output.");
                          speaker.write(data,0,bytesRead);
  
         //                 bais.reset();
                      }
                      ais.close();
                      bais.close();
  
                  }
                 speaker.drain();
                 speaker.close();
                 System.out.println("Stopped listening to incoming audio.");
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
      }
      public static void main(String [] args) throws IOException{
              new ClientStream();
          }
      }
  </code></pre>