尝试处理 this assignment用于练习。很少有人被两个问题困扰。
- 在控制台上打印请求后,我应该在哪里停止线程?稍后我需要在发送响应后执行此操作。
- 我应该从哪里发回回复?我可以通过
processRequest()
轻松完成此操作。正在考虑是否有办法发回 HttpResponse。 从 HttpRequest 类本身发送回响应可以吗?
代码
主类
public final class WebServer {
public static void main(String[] args) throws Exception {
int port = 1983;
final ServerSocket server = new ServerSocket(port);
System.out.println("Comes here");
Socket client = null;
while (true) {
client = server.accept();
System.out.println("Got the connection" + client.toString());
final HttpRequest request = new HttpRequest(client);
Thread thread = new Thread(request);
thread.start();
}
}
}
HttpRequest.java
final class HttpRequest implements Runnable {
Socket socket;
public HttpRequest(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
processRequest();
} catch (IOException e) {
e.printStackTrace();
}
}
private void processRequest() throws IOException {
String headerline = null;
DataOutputStream out = null;
BufferedReader in = null;
out = new DataOutputStream(socket.getOutputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while ((headerline = in.readLine()).length() != 0) {
System.out.println(headerline);
}
out.close();
in.close();
socket.close();
}
}
最佳答案
一旦套接字关闭,线程就会终止。
要以这种形式输出到客户端,您必须生成自己的需要发送到客户端的 Http header 以及要发送到客户端的所有数据。为此,您可以执行以下操作:
out.writeBytes(<HttpHeaderString>);
然后对于您的文件,您可以执行以下操作:
FileInputStream fileToClient;
OutputStream toClient;
byte[] buffer = new byte[2048];
int bytes = 0;
while ((bytes = fileToClient.read(buffer)) != -1){
toClient.write(buffer, 0, bytes);
}
关于Java:实现多线程 Web 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29476803/