2012-01-31 3 views
-1

서블릿과 연결되어있는 응용 프로그램을 만들려고합니다. 디버거는 오류를 표시하지 않고 서블릿도는 오류가 여전히 코드가 작동하지 않습니다이 안드로이드 응용 프로그램 My_appActivity.java에게 있습니다어떻게 안드로이드 애플 리케이션에서 서블릿에 연결 하시겠습니까?

package com.m_app.first_app; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import com.m_app.first_app.R; 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

public class My_appActivity extends Activity{ 
    public static final String TAG = "SearchRecord"; 
    private EditText mEditText1; 
    private Button mButton1; 

    @Override 
    public void onCreate(Bundle icicle) 
    { 
     Log.v(TAG, "Activity State: onCreate()"); 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 

    // Obtain handles to UI objects 
     mEditText1 = (EditText) findViewById(R.id.editText1); 
     mButton1 = (Button) findViewById(R.id.button1); 


    // Register handler for UI elements 
     mButton1.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View v) 
      { 
       Log.d(TAG, "mButton1 clicked"); 
       String keyword = mEditText1.getText().toString(); 
       networkthread ob = new networkthread(keyword); 
      }   
     });  
    } 
} 

class networkthread implements Runnable 
{ 
    public static final String TAG = "SearchRecord"; 
    String keyword; 
    public networkthread(String keyword) 
    { 
     this.keyword=keyword; 
     Thread t = new Thread(this); 
     t.start(); 
    } 
    public void run() 
    { 
     Log.v(TAG,"Inside the sub thread"); 
     try 
     { 
      Log.v(TAG,"Inside try"); 
      Log.v(TAG,"Before conn"); 
      URL url = new URL("http://10.0.2.2:8080/My_project/yahoo"); 
      HttpURLConnection conn = (HttpURLConnection)url.openConnection();   
      conn.setDoInput(true); 
      conn.setDoOutput(true); 
      conn.setRequestMethod("POST"); 
      conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      conn.setRequestProperty("Accept", "application/octet-stream"); 
      conn.connect(); 
      Log.v(TAG,"After conn"); 
      OutputStream out = conn.getOutputStream(); 
      Log.v(TAG,"Before DOS"); 
      DataOutputStream dos = new DataOutputStream(out); 
      Log.v(TAG,"After DOS"); 
      dos.writeInt(keyword.getBytes().length); 
      dos.write(keyword.getBytes(),0,keyword.getBytes().length); 
      dos.flush(); 
      dos.close(); 
      InputStream is = conn.getInputStream(); 
      DataInputStream dis = new DataInputStream(is); 
      String status = dis.readLine(); 
      conn = null; 
      Log.v(TAG,"Finish try"); 
     } 
     catch (Exception e) 
     { 
      Log.v(TAG,"Exception: "+e); 
      e.printStackTrace(); 
     } 
    } 
} 

서블릿은 다음과 같습니다

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.*; 
import java.net.*; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.nio.*; 
import java.io.*; 

public class search extends HttpServlet { 
    private InputStream is = null; 
    private DataInputStream dis = null; 
    PrintWriter out; 
    protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException , IOException{ 
     try{ 
      out=response.getWriter(); 
      is = request.getInputStream(); 
      dis = new DataInputStream(is); 
      int len = dis.readInt(); 
      byte data[] = new byte[len]; 
      dis.read(data,0,len); 
      String Keyword = new String(data); 
      out.print("Keyword :"+Keyword); 
      is.close(); 
      dis.close(); 
      String s= "success"; 

     } catch(Exception e) 
     { 
      out.print(e); 
     } 
    } 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     service(request,response); 
    }  
} 
+2

"작동하지 않음"을 정의하십시오. 예외가 발생했는지, 서버 측과 클라이언트 측 모두에서 로깅을 모두 보았습니까? –

+0

클라이언트 측 (안드로이드 애플 리케이션)에서 아무런 흥분을 얻지 못하고 서버 측에서 서블릿은 EOFException을 제공합니다. int len ​​= dis.readInt(); – Mandeep

답변

0

문제가되면 확실히 POST의 Content-Type 헤더입니다. 서블릿에 URL 인코딩 형식을 보내고 요청 본문에 원시 바이트 데이터를 저장하도록 지시하고 있습니다.

또한 실제로 콘텐츠 길이를 본문에 쓸 필요가 없습니다. 대신 콘텐츠 길이 헤더에 내용을 쓰지 않으시겠습니까? 왜 HTTP 프로토콜에 내장 된 것을 더 잘 활용하지 않을까요?

+0

다음을 추가하여 Run() 메서드를 변경했습니다. conn.setFixedLengthStreamingMode (keyword.getBytes(). length); 콘텐츠 형식 헤더도 생략했지만 서블릿에서 동일한 EOFException을받는 경우 – Mandeep

+0

콘텐츠 형식 헤더를 제공해야하며 보내는 콘텐츠 유형과 실제로 일치하는 헤더 형식을 사용해야합니다. –

관련 문제