Android Open Source - ZShaolin sockethandler






From Project

Back to project page ZShaolin.

License

The source code is released under:

GNU General Public License

If you think the Android project ZShaolin listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.// ww w .j  a v a  2s  .c  o  m
 */

package com.spartacusrex.spartacuside.web;

import android.content.Context;
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.RandomAccessFile;
import java.net.Socket;
import java.net.URLDecoder;
import java.util.Date;

/**
 *
 * @author Spartacus Rex
 */
public class sockethandler implements Runnable {

    /*
     * Static Variables
     */
    public static final int BYTE_SKIP_AMOUNT     = 512*512;

    public static final int HTTP_OK              = 200;
    public static final int HTTP_NOT_FOUND      = 404;
    public static final int HTTP_BAD_METHOD     = 405;

    static final byte[] EOL = {(byte)'\r', (byte)'\n' };

    public static final int MAX_RANGE           = 100000;

    long mStartTime = 0;
    
    Context mContext;
    Socket  mSocket;
    boolean mRunning;
    Thread  mHandlerThread;

    webserver mServer;

    public void log(String zLog){
        Log.v("SpartacusRex", "SocketHandler - "+mStartTime+" "+zLog);
    }

    public sockethandler(Socket zSocket, Context zContext, webserver zServer){
        mSocket  = zSocket;
        mContext = zContext;
        mRunning = true;
        mServer  = zServer;
        
        mStartTime = System.currentTimeMillis();

        mHandlerThread = new Thread(this);
        mHandlerThread.start();
    }

    public void stop(){
        log("Stopped");
        mRunning = false;
        /*if(mHandlerThread != null){
            if(mHandlerThread.isAlive()){
                mHandlerThread.interrupt();
            }
        }*/
    }

    public void run() {
        log("Socket handler started");

        try {
            //Wait a second..
            Thread.sleep(250);

            //Get the streams..
            OutputStream os = mSocket.getOutputStream();
            InputStream is  = mSocket.getInputStream();

            //Convert to something useful
            BufferedReader br = new BufferedReader(new InputStreamReader(new BufferedInputStream(is,8192)),8192);
            PrintStream ps    = new PrintStream(os);

            //Read in complete command
            StringBuffer sbuffer = new StringBuffer("");
            String in            = null;
            boolean keepalive    = true;

            while(keepalive && mRunning){

//                while( mRunning && (in = br.readLine()) != null){
                if( mRunning && (in = br.readLine()) != null){
                    /*if(in.equals("")){
                        break;
                    }*/

                    //String in = br.readLine();
                    log("Server Read Line : "+in);
                    sbuffer.append(in+"\n");
                }

                //Log complete
                String com = sbuffer.toString();

                log("Server Complete  : "+com);

                //Write somethinfg to the stream
                ps.println("1 The server says hello!!");
                ps.println("2 The server says hello!!");
                ps.println("3 The server says hello!!");

                //Now process the command
                if(false && !com.equals("")){
                    //Get Command Part
                    int space1      = com.indexOf(" ");
                    int space2      = com.indexOf(" ", space1+1);
                    String command  = com.substring(0,space1).trim();
                    String getfile  = com.substring(space1,space2).trim();

                    String urlfile = URLDecoder.decode(getfile);

                    log("READ FILE : ."+urlfile);
                    
                    File httpfile         = new File(urlfile);
                    
                    boolean head = command.equalsIgnoreCase("HEAD");
                    boolean get  = command.equalsIgnoreCase("GET");

                    int index = com.indexOf("Keep-Alive");
                    keepalive = (index != -1);
                    //log("FULL COMMAND : "+com+" INDEX:"+index);

                    //Get the required range
                    long[] range = getRange(com);
                    if(range[0] == -1){
                        range[0] = 0;
                        range[1] = httpfile.length();
                        log("No Range Specified..!");
                    }

                    log("Write Head "+range[0]+" "+range[1]);
                    writeHead(ps, httpfile);
                    
                    //rangeavail = false;
                    if(get){
                        log("Write File xx  "+range[0]+" "+range[1]);
//                        writeFromStream(ps, httpfile,range);
                        writeFile(ps, httpfile,range);
                    }

                    ps.flush();

                }else{
                    //No Input
                    log("No Input - pausing..");
                    keepalive = false;
                    Thread.sleep(100);
                }

                log("keepalive "+keepalive);
                if(keepalive){
                    sbuffer = new StringBuffer("");
                    in      = null;
                }
            }
            
            //Close streams..
            ps.close();
            os.close();
            is.close();

            mSocket.close();

        } catch (Exception iOException) {
            log(iOException.toString());
        }

        //Tell the server
        mServer.sockethandlerFinished(this);

        log("Finished");
    }

    /*void sendFile(File targ, PrintStream ps) throws IOException {
        InputStream is = null;
        ps.write(EOL);
        
        byte[] buffer = new byte[8192];
        
        File input= new File(targ.getAbsolutePath());
        long size = input.length();

        log("Sending file "+targ.getPath());

        while(size < 256*1024){
            try {
                Thread.sleep(250);
            } catch (InterruptedException ex) {
                return;
            }

            log("Waiting for filer downlad "+size);

            size = input.length();
        }

        log("File ready "+targ.getPath());

        /*if(size >= streamdownloader.MAXIMUM_DOWNLOAD){
            //Limit reached..
            return;
        }*/

     /*   size -= BYTE_SKIP_AMOUNT;
        if(size <0){
            size = 0;
        }

        //Open the stream at the end..
        is = new FileInputStream(targ.getAbsolutePath());
        is.skip(size);
        
        try {
            log("Sendfile start "+targ.getPath()+" size "+targ.length()+" "+mRunning);
            int n;
            //while (mRunning && (n = is.read(buffer)) > 0) {
            int count =0;
            while(mRunning) {
                n = is.read(buffer);
                count += n;
                //log("Bytes read : "+n+"  / total "+count);
                if(n>0){
                    ps.write(buffer, 0, n);
                }else if(n==-1){
                    //EOF
                    mRunning = false;
                }else{
                    //Thread.sleep(100);
                }
            }
            log("Sendfile finish "+mRunning+" "+targ.getPath());

        }catch(Exception exc){
            log("Sendfile : "+exc.toString());

        } finally {
            is.close();
        }

    }*/

    protected void writeHead(PrintStream zStream, File zFile) throws IOException{
        zStream.print("HTTP/1.0 " + HTTP_OK +" OK");
        zStream.write(EOL);
        zStream.print("Server: Simple Android Java");
        zStream.write(EOL);
        zStream.print("Date: " + (new Date()));
        zStream.write(EOL);
        //zStream.print("Content-length: " + zFile.length());
        zStream.print("Content-length: 250000000");
        zStream.write(EOL);
        zStream.print("Last Modified: "  + (new Date()));
        zStream.write(EOL);
        zStream.print("Content-type: audio/mpeg");
        zStream.write(EOL);
        zStream.write(EOL);
    }

    /*protected void writeFromStream(PrintStream zStream, File zFile, long[] zRange) throws IOException, InterruptedException{
        byte[] bytes = new byte[8192];

        BufferedInputStream bin = new BufferedInputStream(mMusicStream);

        int counter = 0;
        while(mRunning){
            //Suck from stream..
            int ret = bin.read(bytes);

            if(ret>0){
                zStream.write(bytes,0,ret);
                counter += ret;
                log("Wrote "+ret+" "+counter);
                Thread.sleep(50);
            }else{
                log("Data Sound Stream Pause.. ");
                Thread.sleep(500);
            }
        }

        bin.close();

        log("Write from stream finished");
    }*/

    protected void writeFile(PrintStream zStream, File zFile, long[] zRange) throws IOException, InterruptedException{
        log("Sockethandler writeFile");
        
        long size  = zFile.length();
    
//        while(mRunning && (zRange[0] >= (zFile.length() - MAX_RANGE + 32))) {
        while(mRunning && size<BYTE_SKIP_AMOUNT) {
            //Pause.
            log("Pausing to buffer more of the stream "+size+" / "+BYTE_SKIP_AMOUNT);
            Thread.sleep(500);
            size  = zFile.length();
        }

        //Check still running..
        if(!mRunning){
           log("Sockethandler - not running.. exit");
           return;
        }

        //About to start music
        //log("About to start music..! "+mStartWriteFile);
        //Thread.sleep(5000);

        //Skip to start
        RandomAccessFile filein = new RandomAccessFile(zFile, "r");
        filein.seek(0);

        int bufsize      = 8192;
        byte[] bytes     = new byte[bufsize];
        int counter      = 0;

        int ret;
        boolean slowdown = false;
        int slowcount=0;
        while(mRunning){
            ret = filein.read(bytes);
            if(ret > 0){
                zStream.write(bytes, 0, ret);
                counter           += ret;
                
                //log("Output data : "+counter);
                if(slowdown){
                    Thread.sleep(100);
                    slowcount++;
                    if(slowcount > 10){
                        //log("Slow turned off..!");
                        slowdown  = false;
                        slowcount = 0;
                    }
                }
                
            }else{
                //log("ret == -1 - pause for a sec..");
                Thread.sleep(1000);
                slowcount = 0;
                slowdown  = true;
            }
        }

        filein.close();

        log("Finished Write.. count:"+counter+" running:"+mRunning);
    }

    protected long[] getRange(String zCommand){
        String lower = zCommand.toLowerCase();
        long[] ret = new long[2];

        int index = lower.indexOf("range");

        ret[0] = -1;
        ret[1] = -1;

        if(index != -1){
            int start  = lower.indexOf( "=", index)+1;
            int equals = lower.indexOf( "-", index);
            int eol   = lower.indexOf( "\n", index);

            String substring1 = lower.substring(start, equals);
            String substring2 = lower.substring(equals+1, eol);

            ret[0] = Long.parseLong(substring1);
            ret[1] = Long.parseLong(substring2);
        }

        //if(ret[1] - ret[0] > MAX_RANGE){
        //   ret[1] =  ret[0] + MAX_RANGE;
        //}

        return ret;
    }
}




Java Source Code List

com.spartacusrex.spartacuside.EmulatorView.java
com.spartacusrex.spartacuside.Exec.java
com.spartacusrex.spartacuside.TermDebug.java
com.spartacusrex.spartacuside.TermPreferences.java
com.spartacusrex.spartacuside.TermService.java
com.spartacusrex.spartacuside.TermViewFlipper.java
com.spartacusrex.spartacuside.Term.java
com.spartacusrex.spartacuside.WindowList.java
com.spartacusrex.spartacuside.keyboard.CandidateView.java
com.spartacusrex.spartacuside.keyboard.KeyboardPrefs.java
com.spartacusrex.spartacuside.keyboard.KeyboardSwitcher.java
com.spartacusrex.spartacuside.keyboard.LatinKeyboardView.java
com.spartacusrex.spartacuside.keyboard.LatinKeyboard.java
com.spartacusrex.spartacuside.keyboard.MyKeyboardView.java
com.spartacusrex.spartacuside.keyboard.TerminalKeyboard.java
com.spartacusrex.spartacuside.model.Screen.java
com.spartacusrex.spartacuside.model.TextRenderer.java
com.spartacusrex.spartacuside.model.UpdateCallback.java
com.spartacusrex.spartacuside.session.TermSession.java
com.spartacusrex.spartacuside.session.TerminalEmulator.java
com.spartacusrex.spartacuside.session.TranscriptScreen.java
com.spartacusrex.spartacuside.util.ByteQueue.java
com.spartacusrex.spartacuside.util.ServiceForegroundCompat.java
com.spartacusrex.spartacuside.util.TermSettings.java
com.spartacusrex.spartacuside.util.dialogpref.java
com.spartacusrex.spartacuside.util.hardkeymappings.java
com.spartacusrex.spartacuside.util.keydata.java
com.spartacusrex.spartacuside.web.sockethandler.java
com.spartacusrex.spartacuside.web.webserver.java
org.dyne.zshaolin.Start.java
org.dyne.zshaolin.startup.TerminalIDEPrefs.java
org.dyne.zshaolin.startup.setup.assetextract.java
org.dyne.zshaolin.startup.setup.filemanager.java
org.dyne.zshaolin.startup.installer.java
org.dyne.zshaolin.startup.introscreen.java