带有PrintWriter的简单Java服务器 - 问题向浏览器发送响应
-
09-10-2019 - |
题
我刚刚开始查看HTTP等。并写了一个简单的Java客户端,该客户端使用URLConnection将URL发送到服务器并拉下index.html页面(如纯文本)。
现在,我正在使用简单的服务器工作,但我陷入了第一个障碍(也许第二或第三个),我无法正确响应客户。
这是循环的读数,它在http请求中读取正常,即使在ff和ie等中也可以读取:
while((message = in.readLine()) != null)
{
System.out.println(message);
out.write("something");
}
问题是我不知道如何使它响应任何有用的东西。如果我让它在上面的代码中执行它正在执行的操作,它将向我的客户发送6次“ Something”(因为HTTP请求有6行),但没有任何ff/ie等。
另外,当我添加一个 System.out.println("test");
循环后要打印的行,但是服务器似乎从未达到这一点,应该吗?应该在第一个HTTP请求的末尾readline()返回null吗?
我一直在阅读阳光和甲骨文网站上的内容,但仍然对此如何工作仍然很困难。
谢谢你的时间,
Infinitifizz
编辑:糟糕,忘了复制代码。
server.java:
package exercise2;
import java.net.*;
public class Server
{
public static void main(String[] args) throws Exception
{
boolean listening = true;
ServerSocket server = new ServerSocket(8081);
while(listening)
{
Socket client = server.accept();
new ServerThread(client).start();
}
server.close();
}
}
serverthread.java:
package exercise2;
import java.io.*;
import java.net.*;
public class ServerThread extends Thread
{
private Socket socket = null;
public ServerThread(Socket s)
{
this.socket = s;
}
public void run()
{
try
{
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String message, reply = "";
while((message = in.readLine()) != null)
{
System.out.println(message);
out.write("something");
}
System.out.println("test");
in.close();
out.close();
socket.close();
}
catch(IOException e)
{
System.err.println("error");
}
}
}
解决方案
首先,将条件在while循环中更改为
while(in.hasNextLine()) {
message = in.nextLine();
//etc....
其次,您无需在运行服务器时退出时循环。您应该对while循环内部的请求进行所有解析,使用if语句来区分请求。您唯一一次退出WHIL循环是连接应关闭的时候,否则 nextLine()
方法将阻止直到收到东西。
其他提示
没有看到您的客户端代码,这是我对正在发生的事情的最佳猜测:
您的服务器可能会在该readline()中阻塞,因为客户端完成了编写请求,但尚未关闭该连接(如:客户应该等待以在同一连接上获得响应)。通常,HTTP服务器在读取它时解析请求:基于 这个, ,您可以查找“ r n r n”来划定标头的末端,并在此时脱离阅读循环以解析请求并响应它。