Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java how to handle HTTP GET request after establishing TCP connection

So after establishing my listening for a connection and accepting one:

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

When I type into my browser localhost:6789/index.html how do I handle this incoming GET request and return index.html? index.html is in the same directory.

Firstly I want to very that index.html actually exists and if not I return a HTTP 404 message. Then I will close the connection.

like image 418
meiryo Avatar asked Dec 15 '22 19:12

meiryo


2 Answers

Handling GET and other requests is actually very simple but you must know the specification of the HTTP protocol.

The first thing to do is to get the SocketInputStream of the client and the path of the file to return. The first line of the HTTP request comes in this form: GET /index.html HTTP/1.1. Here is a code example that does that:

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];

You create a new File object and checks if that file exists. If the file does not exist, you return a 404 response to the client. Otherwise you read the file and send its content back to the client:

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();    

Here is the complete code summary:

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();
like image 127
Dimitri Avatar answered Dec 18 '22 07:12

Dimitri


If you just want a Java-based web server which handles HTTP requests for you then you should look at Tomcat, which will look after things like returning static files automatically, and will also allow you to define Java code to provide custom responses to specific requests.

You should read some kind of Tomcat Quick Start guide, and get a basic understanding of Java Servlets and JSPs.

An alternative, which can be easier be set up and configure is Jetty, so you might want to have a look at that one as well.

like image 25
codebox Avatar answered Dec 18 '22 08:12

codebox