0

I need a help with some networking.

What i am trying to do is to send request to servlet from android and then servlet sends the response back to me.

Here is my code

GSP Client Activity

package com.gps.gpsclient;
import microsoft.mappoint.TileSystem;

import org.osmdroid.api.IProjection;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;



public class GPSClientActivity extends Activity {

private MapView view;
private MapDrawer mainDrawer;
private Intent intent;
private MapController mapController;
private static final String RequestorUrl="http://192.168.1.104:8080/Requestor/RQSRV";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gps);
        view = (MapView) findViewById(R.id.mapView);
        view.setTileSource(TileSourceFactory.MAPNIK);
        view.setBuiltInZoomControls(true);
        mapController = view.getController();
        mapController.setZoom(10);
        GeoPoint point2 = new GeoPoint(51496994, -134733);
        mapController.setCenter(point2);
        mainDrawer=new MapDrawer(view);

        final Button button = (Button) findViewById(R.id.addButton);
        button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                intent=new Intent(GPSClientActivity.this,WaypointSetupActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivityForResult(intent,1);
                return false;
            }
        }); 

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode==RESULT_OK)
        {
            final MapPoint point=(MapPoint) data.getSerializableExtra("result");
             GeoPoint point2 = new GeoPoint(51496994, -134254);
             point.setGeo(point2);



                        view.setOnTouchListener(new View.OnTouchListener()
                        {
                            boolean added=false;
                            @Override
                            public boolean onTouch(View v, MotionEvent e) 
                            {
                                if(!added)
                                {

                                    IProjection project = view.getProjection();
                                    final GeoPoint geo = (GeoPoint)project.fromPixels((int)e.getX(),(int)e.getY());
                                    mainDrawer.addGeopointToMap(point.getName(), point.getDesc(), geo);
                                    added=true;
                                    Toast.makeText(view.getContext(), "Waypoint "+point.getName()+" was added to Map ", Toast.LENGTH_LONG).show();
                                    DBAccessManager manager=new DBAccessManager();  
                                    manager.AddWaypointToDb(point.getName(), point.getDesc(), 1, 1, geo.getLatitudeE6(), geo.getLongitudeE6()); 


                                }
                                return false;
                            }});
    }



}
}

DBAccessManager class

package com.gps.gpsclient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.concurrent.ExecutionException;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.AsyncTask;

public class DBAccessManager extends AsyncTask <DBManagerParams, Void,String>
{
    //public static final String Url="http://192.168.1.104:8080/Requestor/RQSRV";
    public static final String Url="http://158.193.82.6:8080/Requestor/RQSRV";


    public DBAccessManager()
    {

    }

    public void AddWaypointToDb(String name,String desc,int Type,int Priority,long Latitude,long Longtitude)
    {
        String[] headers=new String[10];
        String[] headers_values=new String[10];

        headers[0]="type of command";
        headers_values[0]="insert waypoint";

        headers[1]="name";
        headers_values[1]=name;

        headers[2]="decription";
        headers_values[2]=desc;

        headers[3]="type";
        headers_values[3]=Integer.toString(Type);

        headers[4]="priority";
        headers_values[4]=Integer.toString(Priority);

        headers[5]="latitude";
        headers_values[5]=Long.toString(Latitude);

        headers[6]="longtitude";
        headers_values[6]=Long.toString(Longtitude);


        String response = null;
        DBManagerParams params=new DBManagerParams(Url,headers,headers_values);
        try 
        {
            response=execute(params).get();
        } 
        catch (InterruptedException e) 
        {
            e.printStackTrace();
        } 
        catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println(response);  
    }

     private String readOutput(InputStream in)
     {
         StringBuffer outputBuffer = new StringBuffer("");
         try 
         {
             BufferedReader buffer = new BufferedReader(new InputStreamReader(in));
             String s = "";
             while ((s = buffer.readLine()) != null)
                 outputBuffer.append(s);
         } 
         catch (IOException e) 
         {
             e.printStackTrace();
         }
         return outputBuffer.toString();

     }

     private InputStream getHttpOutConnection(String urlString,String[] headers,String[]header_values)  {
         InputStream stream=null;
         URL url = null;
         try {
             url = new URL(urlString);
             System.out.println(""+urlString);

             URLConnection connection= url.openConnection();


             HttpURLConnection httpConnection = (HttpURLConnection) connection;
             httpConnection.setDoOutput(true);
             httpConnection.setDoInput(true);
             httpConnection.setRequestMethod("POST");
             if (headers.length !=header_values.length)
             {
                 System.err.println("Bad use of headers in :"+this.getClass().toString()+" Method: "+ this.getClass().getEnclosingMethod().getName());
             }
             else
             {
                 for(int i =0;i<headers.length;i++)
                 {
                     if (headers[i]!=null)
                         httpConnection.setRequestProperty(headers[i], header_values[i]);
                 }

                 httpConnection.setReadTimeout(10000 /* milliseconds */);
                 httpConnection.setConnectTimeout(15000 /* milliseconds */);
                 httpConnection.setDoInput(true);
                 httpConnection.connect();

                 if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {

                    System.out.println("HTTP OK");
                    stream=httpConnection.getInputStream(); 
                 }
             }
         } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 





         return stream;

     }

    @Override
    protected String doInBackground(DBManagerParams... params) {
        String response;
        response=readOutput(getHttpOutConnection(params[0].URL,params[0].headers,params[0].headers_values));
        return response;
    }

}

class DBManagerParams
{
    String URL;
    String[]headers;
    String[]headers_values;
    String response;

    DBManagerParams(String URL,String[]headers,String[]headers_values)
    {
        this.URL=URL;
        this.headers=headers;
        this.headers_values=headers_values;

    }
}

Servlet side

package Applications;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.OutputStreamWriter;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "/RQSRV", urlPatterns = {"/RQSRV"})
public class RQSRV extends HttpServlet {

    private static final long serialVersionUID = 1L;
    private DBConnectionManager DBmanager;
    public RQSRV() {
        super();
        DBmanager=new DBConnectionManager();
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        System.out.println("Get was called");
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        if (response.getHeader("type of command").equals("insert waypoint"))
        {
            String name,desc;
            int type,prio;
            long latitude,longtitude;
            name=response.getHeader("name");
            desc=response.getHeader("description");
            type=Integer.parseInt(response.getHeader("type"));
            prio=Integer.parseInt(response.getHeader("priority"));
            latitude=Long.parseLong(response.getHeader("latitude"));
            longtitude=Long.parseLong(response.getHeader("longtitude"));
            DBmanager.Connect();
            String command="insert into waypoints values("+(DBmanager.getMaxWaypointId()+1)+",0,"+name+","+desc+","+prio+","+latitude+","+longtitude+")";
            DBmanager.ExecuteQueryWithoutResults(command);
        }
    }
}

App stops working while i call httpConnection.connect().
It is just trying to connect and then after a while it stops on connection timeout.

Things i check:

  • Servlet is running, and it's accesible from Web Browser
  • All firewals are stopped
  • Url of servlet is right

I hope you know what it should be

4

1 回答 1

0

在您的服务器 servlet 端,您使用“响应”来获取 Android 发送的数据?获取数据是“请求”

if (request.getHeader("type of command")!=null && request.getHeader("type of command").equals("insert waypoint"))
        {
            String name,desc;
            int type,prio;
            long latitude,longtitude;
            name=request.getHeader("name");
            desc=request.getHeader("description");
            type=Integer.parseInt(request.getHeader("type"));
            prio=Integer.parseInt(request.getHeader("priority"));
            latitude=Long.parseLong(request.getHeader("latitude"));
            longtitude=Long.parseLong(request.getHeader("longtitude"));
            DBmanager.Connect();
            String command="insert into waypoints values("+(DBmanager.getMaxWaypointId()+1)+",0,"+name+","+desc+","+prio+","+latitude+","+longtitude+")";
            DBmanager.ExecuteQueryWithoutResults(command);

            //important send status ok to ANDROID to prevent timeout.
            response.setStatus(HttpServletResponse.SC_OK);


        }else{

            //important send status ok to ANDROID to prevent timeout.
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        }
于 2013-09-16T14:15:28.510 回答