我刚刚开始查看HTTP等,并编写了一个简单的Java客户端,它使用URLConnection将URL发送到服务器并下拉index.html页面(作为纯文本)。
现在我正在开发一个简单的服务器,但是我遇到了第一个障碍,(好吧可能是第二或第三个),我无法让它正确响应客户端。
这是循环读取,它读取HTTP请求很好,甚至从FF和IE等:
while((message = in.readLine()) != null)
{
System.out.println(message);
out.write("something");
}
问题在于我不知道如何让它回应任何有用的东西。如果我让它在上面的代码中执行它所做的事情,它会向我的客户端发送6次“某事”(因为HTTP请求有6行),但没有给FF / IE等。
此外,它似乎没有打破循环,因为我在循环后添加了System.out.println("test");
行进行打印,但服务器似乎永远不会达到这一点,是吗? readLine()应该在第一个HTTP请求结束时返回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");
}
}
}
答案 0 :(得分:2)
如果没有看到您的客户端代码,我最好猜测发生了什么:
您的服务器可能在该readLine()中阻塞,因为客户端已完成写入请求,但尚未关闭连接(因为它应该:客户端应该等待以通过同一连接获得响应)。通常,HTTP服务器在读取请求时会对其进行解析:基于this,您可以查找“\ r \ n \ r \ n”来划分标题的末尾,并中断读取循环在那时解析请求并回复它。
答案 1 :(得分:0)
首先,将while循环中的条件更改为
while(in.hasNextLine()) {
message = in.nextLine();
//etc....
其次,在运行服务器时,您不需要退出while循环。您应该对while循环内的请求进行所有解析,使用if语句来区分请求。退出while循环的唯一时间是连接应该关闭,否则,nextLine()
方法将阻塞,直到收到某些内容。