A Java class that works as an application but not as an applet

A Java class that works as an application but not as an applet … here is a solution to the problem.

A Java class that works as an application but not as an applet

I’m an Android developer and don’t have extensive knowledge of Java web development, so if the question is a little weird, please bear with me. I created a java class that should receive a packet in the form of audio from an android application and play it on a PC speaker. The app is basically a streaming app from your phone to your server. The class works well as an application.

Here is the code for the class:

class Server {

AudioInputStream audioInputStream;
static AudioInputStream ais;
static AudioFormat format;
static boolean status = true;
static int port = 50005;
static int sampleRate = 8000;

public static void main(String args[]) throws Exception {

DatagramSocket serverSocket = new DatagramSocket(50005);

/**
     * Formula for lag = (byte_size/sample_rate)*2
     * Byte size 9728 will produce ~ 0.45 seconds of lag. Voice slightly broken.
     * Byte size 1400 will produce ~ 0.06 seconds of lag. Voice extremely broken.
     * Byte size 4000 will produce ~ 0.18 seconds of lag. Voice slightly more broken then 9728.
     */

byte[] receiveData = new byte[5000];

format = new AudioFormat(sampleRate, 16, 1, true, false);

while (status == true) {
        DatagramPacket receivePacket = new DatagramPacket(receiveData,
                receiveData.length);

serverSocket.receive(receivePacket);

ByteArrayInputStream baiss = new ByteArrayInputStream(
                receivePacket.getData());

ais = new AudioInputStream(baiss, format, receivePacket.getLength());
        toSpeaker(receivePacket.getData());

}

}

public static void toSpeaker(byte soundbytes[]) {
    try {

DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format);
        SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);

sourceDataLine.open(format);

FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
        volumeControl.setValue(6.0206f);

sourceDataLine.start();
        sourceDataLine.open(format);

sourceDataLine.start();

System.out.println("format? :" + sourceDataLine.getFormat());

sourceDataLine.write(soundbytes, 0, soundbytes.length);
        System.out.println(soundbytes.toString());
        sourceDataLine.drain();
        sourceDataLine.close();
    } catch (Exception e) {
        System.out.println("Not working in speakers...");
        e.printStackTrace();
    }
}
}

Now I want to convert the class to a small program so that I can deploy it as a web application. This is the code of the applet:

public class AppletTest extends Applet {

AudioInputStream audioInputStream;
    static AudioInputStream ais;
    static AudioFormat format;
    static boolean status = true;
    static int port = 50005;
    static int sampleRate = 8000;

public void init()
    {

}

public void stop()
    {

}

public void listening()
    {
         DatagramSocket serverSocket = null;
        try {
            serverSocket = new DatagramSocket(50005);
        } catch (SocketException e) {
             TODO Auto-generated catch block
            e.printStackTrace();
        }

/**
             * Formula for lag = (byte_size/sample_rate)*2
             * Byte size 9728 will produce ~ 0.45 seconds of lag. Voice slightly broken.
             * Byte size 1400 will produce ~ 0.06 seconds of lag. Voice extremely broken.
             * Byte size 4000 will produce ~ 0.18 seconds of lag. Voice slightly more broken then 9728.
             */

byte[] receiveData = new byte[5000];

format = new AudioFormat(sampleRate, 16, 1, true, false);

while (status == true) {
                DatagramPacket receivePacket = new DatagramPacket(receiveData,
                        receiveData.length);

try {
                    serverSocket.receive(receivePacket);
                } catch (IOException e) {
                     TODO Auto-generated catch block
                    e.printStackTrace();
                }

ByteArrayInputStream baiss = new ByteArrayInputStream(
                        receivePacket.getData());

ais = new AudioInputStream(baiss, format, receivePacket.getLength());
                toSpeaker(receivePacket.getData());

}
    }

public static void toSpeaker(byte soundbytes[]) {
        try {

DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format);
            SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);

sourceDataLine.open(format);

FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
            volumeControl.setValue(6.0206f);

sourceDataLine.start();
            sourceDataLine.open(format);

sourceDataLine.start();

System.out.println("format? :" + sourceDataLine.getFormat());

sourceDataLine.write(soundbytes, 0, soundbytes.length);
            System.out.println(soundbytes.toString());
            sourceDataLine.drain();
            sourceDataLine.close();
        } catch (Exception e) {
            System.out.println("Not working in speakers...");
            e.printStackTrace();
        }
    }

}

Call the html code of the applet:

<HTML>
<TITLE>Applet Test</TITLE>
<HEAD></HEAD>
<BODY>
<applet code="AppletTest.class" height="200" width="500">Applet</applet>
</BODY>
</HTML>

Mini Program I’ve hostedhere

This is the android activity that sends sounds in packet form:

public class SendActivity extends Activity {
    private Button startButton, stopButton;

public byte[] buffer;
    public static DatagramSocket socket;
    private int port = 50005;
    AudioRecord recorder;

private int sampleRate = 8000;
    @SuppressWarnings("deprecation")
    private int channelConfig = AudioFormat.CHANNEL_IN_MONO;
    private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
    int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig,
            audioFormat);
    private boolean status = true;

int bufferSizeInBytes;
    int bufferSizeInShorts;
      int shortsRead;
      short audioBuffer[];

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send);

startButton = (Button) findViewById(R.id.start_button);
        stopButton = (Button) findViewById(R.id.stop_button);

startButton.setOnClickListener(new View.OnClickListener() {

@Override
            public void onClick(View v) {

status = true;
                startStreaming();

}

});

stopButton.setOnClickListener(new View.OnClickListener() {

@Override
            public void onClick(View v) {

status = false;
                recorder.release();
                Log.d("VS", "Recorder released");

}

});

minBufSize += 5120;
        System.out.println("minBufSize: " + minBufSize);
    }

public void startStreaming() {

Thread streamThread = new Thread(new Runnable() {

@Override
            public void run() {
                try {

DatagramSocket socket = new DatagramSocket();
                    Log.d("VS", "Socket Created");

byte[] buffer = new byte[minBufSize];

Log.d("VS", "Buffer created of size " + minBufSize);
                    DatagramPacket packet;

final InetAddress destination = InetAddress
                            .getByName("http://abhideepmallick.byethost16.com/");

final InetAddress destination = InetAddress.getByName("192.168.1.20");//machine IP

Log.d("VS", "Address retrieved");

recorder = new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION,
                            sampleRate, channelConfig, audioFormat,
                            minBufSize * 10);
                    Log.d("VS", "Recorder initialized");

recorder.startRecording();

while (status == true) {

 reading data from MIC into buffer
                        minBufSize = recorder.read(buffer, 0, buffer.length);

 putting buffer in the packet
                        packet = new DatagramPacket(buffer, buffer.length,
                                destination, port);

socket.send(packet);
                        System.out.println("MinBufferSize: " + minBufSize);

}

} catch (UnknownHostException e) {
                    Log.e("VS", "UnknownHostException");
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.e("VS", "IOException");
                }
            }

});
        streamThread.start();
    }

}

Android layout files:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=". SendActivity" >

<Button
        android:id="@+id/stop_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/start_button"
        android:layout_alignBottom="@+id/start_button"
        android:layout_toRightOf="@+id/start_button"
        android:text="Stop" />

<Button
        android:id="@+id/start_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="79dp"
        android:layout_marginTop="163dp"
        android:text="Start" />

</RelativeLayout>

What should I do to make the java class work as an applet?

Solution

I think you managed to keep your browser’s java plugin up to date in order to launch the applet.

Mini Programs also have a lifecycle like an activity.

The init() method is

like a constructor, and the purpose of the start() method is to notify the applet to start executing.

So override the startup method and call your listening method from there.
For more information, you can explore this slide: http://de.slideshare.net/myrajendra/applet-life-cycle

An example can be found here: http://www.ugrad.cs.ubc.ca/~cs219/CourseNotes/Java/applets/lifecycle.html

Related Problems and Solutions