我找到了一個how to implement a HTTP server hosted on Android的示例。 它可以正常使用HTTP GET方法。使用Android上託管的HTTP服務器檢索POST數據
下面是讀取Socket
的InputStream
並寫入其OutputStream
代碼:
private class HttpResponseThread extends Thread {
Socket socket;
String h1;
HttpResponseThread(Socket socket, String msg) {
this.socket = socket;
h1 = msg;
}
@Override
public void run() {
BufferedReader br;
PrintWriter pw;
String request;
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
request = br.readLine();
pw = new PrintWriter(socket.getOutputStream(), true);
String response =
"<html><head></head>" +
"<body>" +
"<h1>" + h1 + "</h1>" +
"</body></html>";
pw.print("HTTP/1.0 200" + "\r\n");
pw.print("Content type: text/html" + "\r\n");
pw.print("Content length: " + response.length() + "\r\n");
pw.print("\r\n");
pw.print(response + "\r\n");
pw.flush();
msgLog += String.format("Request of %s from %s\n", request, socket.getInetAddress().toString());
socket.close();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
infoMsg.setText(msgLog);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
例如,與URL <android_device_ip>:<server_port>?foo=bar
,輸出爲:
請求? = bar from「client_ip」
在這裏,我可以很容易地檢索GET數據(foo=bar
)。但是,而不是使用HTTP GET方法,我想使用HTTP POST方法...
但我不知道該怎麼做。
PS:有關其餘代碼的更多信息,請參見here。
和哪裏一個消息的有效載荷部分被存儲?在socket.getInputStream()? – Drarig29
@ Drarig29是的,讀取所有輸入流,並用'「\ r \ n \ r \ n」'分割。 –
「分裂」可能不是正確的用詞。您需要從'InputStream'中讀取,直到遇到'\ r \ n \ r \ n「結束請求標頭。然後你必須解析標題才能知道1)是否發送了一個正文,2)它是如何編碼的,3)它是如何終止的。只有這樣你才能從'InputStream'中讀取正文數據(更多細節請參閱[RFC 2616 section 4.4 Message Length](https://tools.ietf.org/html/rfc2616#section-4.4)),然後解析這個主體基於'Content-Type'請求頭('application/x-www-form-urlencoded','multipart/form-data'等)指定的類型。 –