2011-03-30 9 views
0

간단한 클라이언트 - 서버 통신을 구현하려고합니다. 여기 내 클라이언트는 org.apache.http 라이브러리를 사용하여 POST 메서드를 사용하여 일부 데이터를 전송하는 Android 장치이며 Java 서버가 요청을 처리합니다.HTTP 게시 요청 수신시 Java 서버가 응답하지 않음

클라이언트 측 :

public class Client implements LogTag { 
     HttpClient client; 
     HttpParams params; 
     HttpPost post; 
     String address = "example.com"; 

     public Client() { 
      client = new DefaultHttpClient(); 
      post = new HttpPost(address); 
     } 

     public void postData(String data) { 
      try { 
       Log.i(TAG, "Sending...: " + data); 
       List<NameValuePair> pairs = new ArrayList<NameValuePair>(); 
       pairs.add(new BasicNameValuePair("data", data)); 
       Log.i(TAG, "This is the data: " + pairs.get(0)); 

       AbstractHttpEntity ent = new UrlEncodedFormEntity(pairs, HTTP.UTF_8);  
       post.setEntity(ent); 
       //post.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false); 

       HttpResponse response = client.execute(post); 
       if (response != null) { 
        String responseBody = EntityUtils.toString(response.getEntity()); 
        Log.i(TAG, "Server response: " + responseBody); 
       } 
      } catch (UnsupportedEncodingException e1) { 
       e1.printStackTrace(); 
      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      //} catch (URISyntaxException e) { 
      // e.printStackTrace(); 
      } 
     } 

    } 

서버 측 :

public class Server extends Thread { 
    private Socket clientSocket; 
    private BufferedReader fromClient; 
    private DataOutputStream toClient; 

    Server(Socket socket) { 
     this.clientSocket = socket; 
    } 

    public static void main (String args[]) throws Exception { 
     ServerSocket serverSocket = new ServerSocket (
      8888, 10, InetAddress.getByName("example.com")); 
     System.out.println("Server started running on [" + 
      serverSocket.getInetAddress() + ":" + serverSocket.getLocalPort() + "] @ " + getNow()); 

     while(true) { 
      Socket connected = serverSocket.accept(); 
      Server pts = new Server(connected); 
      pts.start(); 
     } 
    } 

    public void run() { 
     String line = null; 
     String contentLength = null; 
     String clientInfo = null; 
     try { 
      clientInfo = clientSocket.getInetAddress() + ":" + clientSocket.getPort(); 
      System.out.println("---------------------"); 
      System.out.println("Client [" + clientInfo + "] is connected @ " + getNow()); 

      fromClient = new BufferedReader(
        new InputStreamReader(clientSocket.getInputStream())); 
      toClient = new DataOutputStream(clientSocket.getOutputStream()); 

      line = fromClient.readLine(); 
      String header = line; 
      System.out.println(header); 
      StringTokenizer tokenizer = new StringTokenizer(header); 
      String httpMethod = tokenizer.nextToken(); 

      if (httpMethod.equals("POST")) { 
       while ((line = fromClient.readLine()) != null) { 
        System.out.println("line: " + line); 
       } 
      } else { 
       System.out.println("Received something-else-request."); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      System.out.println(clientInfo + " logout @ " + getNow()); 
     } 
    } 
} 

서버 측의 출력은 항상 (그러나, 그것은 포스트 헤더를 출력 후 데이터가 도시 직전 달려 그러나

, 콘텐츠 길이 등) - 클라이언트가 연결을 재설정 할 때까지 (이 시점에서 콘솔에 게시물 데이터가 표시됨). 그래서, 게시물 데이터는 이미 서버에 의해 수신되었지만 어떻게 든 나타나지는 않습니다. 이 문제에 대해 어떻게 생각하십니까?

+0

안녕하세요. 동일한 문제가 있습니다. 당신을 위해 고칠 수있는 코드를 게시하는 마음? – KeirDavis

답변

3

서버는 EOS에서만 발생하는 line == null까지 읽습니다. 이는 클라이언트가 연결을 끊었을 때만 발생하며 연결 ​​유지 때문에 HTTP 1.1에서 연기됩니다. 가

(a)는 당신이 라인을 얻을 때까지 모든 헤더를 읽어

(b)는 콘텐츠 길이를 찾을

: 헤더

(c)는 읽었 당신이 일을해야하는 것은 이것이다 입력 스트림으로부터의 바이트 수

chars가 바이트가 아니기 때문에 BufferedReader가 콘텐츠 바이트를 거의 훔칠 것이기 때문에 이렇게하면 DataInputStream과 그 사용되지 않는 readLine() 함수를 사용해야합니다.

실제로이 문제를 다루지 않아야합니다. Java는 이제 HTTP 서버 프레임 워크와 함께 제공됩니다. 실제로이를 대신 사용해야합니다. 또는 Tomcat 또는 Jetty를 배포하고 서블릿을 작성하십시오.

+1

이봐, 나는 같은 문제가있어. 코드를 알려주시겠습니까? – KeirDavis