簡體   English   中英

Java服務器在接收HTTP post請求時掛起

[英]Java server hangs on receiving HTTP post request

我正在嘗試實現簡單的客戶端 - 服務器通信。 這里我的客戶端是一個Android設備,它使用org.apache.http庫使用POST方法發送一些數據,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());
        }
    }
}

然而,服務器端輸出總是在顯示后期數據之前掛起(但是,它輸出帖子標題,內容長度等) - 直到連接被客戶端重置(此時,后期數據顯示在控制台中)。 因此,發布數據已經被服務器接收,但不知何故不會顯示。 你怎么看待這個問題?

服務器讀取直到line == null,這只發生在EOS,這只發生在客戶端斷開連接時,由於連接保持活動而在HTTP 1.1中延遲。 你應該做的是這樣的:

(a)讀取所有標題,直到你得到一個

(b)找到Content-Length:標題

(c)從輸入流中讀取許多字節。

這將強制您使用DataInputStream及其不推薦使用的readLine()函數,因為字符不是字節,而您的BufferedReader幾乎肯定會竊取一些內容字節。

你根本不應該處理這個問題。 Java現在帶有一個HTTP服務器框架,您應該真正使用它。 或者部署Tomcat或Jetty並編寫一個servlet。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM