一、Http網絡請求的原理
二、Http請求服務器的方式。(詳細知識,需要了解報文的格式,之後才能做實驗)
三、如何解析HTTP報文
HTTP1.1 200 OK :表示成功接收
xml文檔 .xml text/xml
XHTML文檔 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文檔 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG圖像 .png image/png
GIF圖形 .gif image/gif
JPEG圖形 .jpeg,.jpg image/jpeg
au聲音文件 .au audio/basic
MIDI音樂文件 mid,.midi audio/midi,audio/x-midi
RealAudio音樂文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二進制數據 application/octet-stream
四、解析每個請求的HTTP報文
HTTP/1.1 200 OK
HTTP/1.1 200 OK
五、利用TCP模擬HTTP傳輸
public class SimpleServer extends Thread{
public static final int PORT = 8000;
private ServerSocket mServerSocket = null;
public SimpleServer(){
try {
mServerSocket = new ServerSocket(PORT);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("端口"+PORT+"已經被佔用,請換一個端口");
}
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
//死循環,接收客戶端的TCP
while(true && mServerSocket != null){
System.out.println("等待客戶端連接");
//調用線程處理數據
}
}
}
②、TCP連接成功後,Server端處理數據(創建DeliverThread來處理數據)
public class DeliverThread extends Thread {
private Socket mServerSocket;
private BufferedReader mBufferedReader;
private PrintWriter mPrintWriter;
public DeliverThread(Socket socket){
mServerSocket = socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
//獲取輸入輸出流
mBufferedReader = new BufferedReader(new InputStreamReader(mServerSocket.getInputStream()));
mPrintWriter = new PrintWriter(mServerSocket.getOutputStream());
//處理Client發送過來的數據
parseRequest();
//回覆Client的數據
handleResponse();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
mBufferedReader.close();
mPrintWriter.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
private void parseRequest() throws IOException{
String line = null;
int lineNum = 0;
//首先解析頭部狀態數據
//然後解析頭部數據
//最後解析傳遞的數據
while((line = mBufferedReader.readLine()) != null){
//如果爲第一行,那麼一定是狀態欄
if (lineNum == 0){
parseHeaderLine(line);
}
lineNum++;
}
System.out.println("解析Service數據完成");
}
private void parseHeaderLine(String line){
//分割Params
String data[] = line.split(" ");
System.out.println("請求類型"+data[0]);
System.out.println("請求的網址"+data[1]);
System.out.println("Http版本:"+data[2]);
}
private void handleResponse(){
mPrintWriter.println("Http/1.1 200 OK");
mPrintWriter.println("Content-Type:text/plain");
mPrintWriter.println("Content-Length:300");
}
}
③、創建Socket端。
ublic class HttpPost extends Thread {
private String mUrl;
private Map<String, String> mParams;
private Socket mClientSocket;
public HttpPost(String url){
mUrl = url;
mParams = new HashMap<>();
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
mClientSocket = new Socket(mUrl,SimpleServer.PORT);
BufferedReader reader = new BufferedReader(new InputStreamReader(mClientSocket.getInputStream()));
PrintWriter writer = new PrintWriter(mClientSocket.getOutputStream());
writeHeader(writer);
waitResponse(reader);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
mClientSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void writeHeader(PrintWriter writer){
writer.println("POST login.php HTTP/1.1");
}
private void waitResponse(BufferedReader reader){
StringBuilder builder = new StringBuilder();
String str = null;
try {
while((str = reader.readLine()) != null){
builder.append(str);
}
System.out.println(builder.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void addParams(String key,String value){
mParams.put(key,value);
}
}