GMs*_*soF 6 java browser io stream
我刚刚编写了一个小程序来测试一些东西,如下所示:
public class Main {
public static void main(String[] args){
ServerSocket serverSocket = null;
Socket clientSocket = null;
DataInputStream dataInputStream= null;
BufferedWriter bufferedWriter = null;
String line ;
try {
serverSocket = new ServerSocket(80);
clientSocket = serverSocket.accept();
dataInputStream = new DataInputStream(clientSocket.getInputStream());
while((line = dataInputStream.readLine()) != null){
System.out.println(line);
}
bufferedWriter = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
bufferedWriter.write("HTTP/1.0 200 OK \n Date: Fri, 31 Dec 1999 23:59:59 GMT \n Content-Type: text/html \n Content-Length: 1354 \n <html>abcde<html/>");
bufferedWriter.flush();
} catch (IOException e) {
System.out.println("socket port cannot be opened.");
e.printStackTrace();
} finally{
try {
serverSocket.close();
bufferedWriter.close();
} catch (IOException e) {
System.out.println("socket port cannot be closed.");
e.printStackTrace();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我从互联网上找到了http响应格式,应该是正确的.问题是我的浏览器继续等待响应数据(从旋转徽标确定),但数据未成功返回.我犯了什么错误?
我通过在浏览器中键入"localhost"连接到Java程序,我可以在Java程序中打印出请求字符串但只是无法发回响应.
首先,发送的 HTTP 消息存在一些问题: HTTP 消息的每一行都以 CR LF 分隔/结束,而不仅仅是换行(虽然我怀疑这可能是问题所在,但您应该替换“ \n" 与 "\r\n")。此外,Content-Length 不等于消息正文的实际大小,应进行替换。在实际正文之前,所有 HTTP 消息都应该有一个空行,但您没有。最后,正斜杠 at<html/>也应该出现在 之前html,如下所示:</html>
总结:
bufferedWriter.write("HTTP/1.0 200 OK\r\nDate: Fri, 31 Dec 1999 23:59:59 GMT\r\nContent-Type: text/html\r\nContent-Length:18\r\n\r\n<html>abcde</html>");
Run Code Online (Sandbox Code Playgroud)
现在真正的问题是:读取循环不断等待更多数据。将 readLine() 的结果与 null 进行比较实际上并没有达到您的要求。TCP 连接产生数据流,您永远不知道客户端是否在特定时刻停止发送数据。相反,您可以一直读取直到找到空行,这标志着 HTTP 消息头的结束。Web 浏览器通常不会在 GET 消息中发送附加内容,因此您不会丢失任何数据。
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
while(!(line = reader.readLine()).isEmpty()){
System.out.println(line);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1768 次 |
| 最近记录: |