2012-09-12 104 views
3

所以建立我的侦听连接,接受一个接一个:的Java如何处理建立TCP连接后,HTTP GET请求

ServerSocket serverSock = new ServerSocket(6789); 
Socket sock = serverSock.accept(); 

当我输入到我的浏览器localhost:6789/index.html我该如何处理这个进入GET请求,并返回index.htmlindex.html位于相同的目录中。

首先,我想非常希望index.html实际上存在,如果没有,我会返回一个HTTP 404消息。然后,我将关闭连接。

+2

你写这是一个学习的过程?有许多现成的基于Java的Web服务器可用于处理HTTP请求。 – codebox

+0

@codebox不,我对Java相当陌生。你能告诉我一些符合我需要的东西吗? – meiryo

回答

9

处理GET和其他请求其实很简单,但您必须知道HTTP protocol的规格。

要做的第一件事是获取客户端的SocketInputStream和文件的路径返回。 HTTP请求的第一行有这种形式:GET /index.html HTTP/1.1。这里是做一个代码示例:

SocketInputStream sis = sock.getInputStream(); 
BufferedReader br = new BufferedReader(new InputStreamReader(sis)); 
String request = br.readLine(); // Now you get GET index.html HTTP/1.1 
String[] requestParam = request.split(" "); 
String path = requestParam[1]; 

该文件是否存在您创建一个新的File对象和检查。如果该文件不存在,则返回一个404响应给客户端。否则,你读取文件并发送其内容返回给客户端:

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
File file = new File(path); 
if(!file.exist()){ 
    out.write("HTTP 404") // the file does not exists 
} 
FileReader fr = new FileReader(file); 
BufferedReader bfr = new BufferedReader(fr); 
String line; 
while((line = bfr.readLine()) != null){ 
    out.write(line); 
} 

bfr.close(); 
br.close(); 
out.close();  

下面是完整的代码摘要:

ServerSocket serverSock = new ServerSocket(6789); 
Socket sock = serverSock.accept(); 

InputStream sis = sock.getInputStream(); 
BufferedReader br = new BufferedReader(new InputStreamReader(sis)); 
String request = br.readLine(); // Now you get GET index.html HTTP/1.1` 
String[] requestParam = request.split(" "); 
String path = requestParam[1]; 

PrintWriter out = new PrintWriter(sock.getOutputStream(), true); 
File file = new File(path); 
if (!file.exists()) { 
    out.write("HTTP 404"); // the file does not exists 
} 
FileReader fr = new FileReader(file); 
BufferedReader bfr = new BufferedReader(fr); 
String line; 
while ((line = bfr.readLine()) != null) { 
    out.write(line); 
} 

bfr.close(); 
br.close(); 
out.close(); 
+0

我在编辑问题。等待我的完整答案 – Dimitri

+0

干杯Dimitri,你能解释为什么只有在输入'localhost:6789/index.html'而不是'localhost:6789/blahblah'时为“index.html”服务?哪一行检查这个? 编辑:对不起,当我编辑此评论时,我的互联网连接死亡。 – meiryo

+1

这是因为blahblah没有托管在你的服务器上。看到我完整编辑的答案 – Dimitri

2

如果您只是想要一个基于Java的Web服务器来处理HTTP请求,那么您应该看看Tomcat,它会自动返回静态文件,并且还允许您定义Java代码以提供自定义对特定请求的回应。

您应该阅读某种Tomcat快速入门指南,并获得对Java Servlet和JSP的基本了解。

另一种可以更容易设置和配置的方法是Jetty,因此您可能也需要查看该选项。