0
我想寫一個簡單的HTTP服務器,僅用於練習,而且我已經插入了20行,並且已經卡住了。簡單的HTTP協議實現不會從InputStream中讀取HTTP請求標頭的循環
package httpd;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Httpd {
public static void main(String[] args) {
try (
ServerSocket server = new ServerSocket(1500);
Socket sock = server.accept();
InputStream in = sock.getInputStream();) {
int b;
while ((b = in.read()) != -1) {
System.out.write(b);
}
System.out.println("Sending HTTP Response");
} catch (IOException e) {
e.printStackTrace();
}
}
}
這是所有罰款,頭被寫入到out
流在我的控制檯:
GET/HTTP/1.1
Host: 127.0.0.1:1500
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/49.0.2623.108 Chrome/49.0.2623.108 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
而且thatls它。之後它就坐在那裏。它從不打印Sending HTTP Response
,只是坐在那裏。 Google Chrome正在向後旋轉微調器,等待響應。他們都掛起,直到我殺了谷歌瀏覽器的頁面,然後將服務器輸出Sending HTTP Response
我不能迴應,除非while
循環被打破,也不會出於某種原因打破。爲什麼?
編輯:
package httpd;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Httpd {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(1500);
Socket sock = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
int b;
while ((b = in.read()) != -1) {
System.out.write(b);
}
System.out.println("Sending HTTP Response");
} catch (IOException e) {
e.printStackTrace();
}
}
}
這工作。我不知道爲什麼。有人可以解釋嗎?
將嘗試(甚至編譯?) –
查找try-with-resources。它相當於在finally塊中的()括號內的所有資源上調用.close()。 – Gala