Implementação de Get condicional em um servidor HTTP

0 respostas
C

Boa tarde pessoal,

Estou com um problema aqui. Tenho um trabalho de faculdade onde o objetivo é implementar um servidor web multithread em Java
com o método Get e o Get Condicional.
Já o implementei com o método Get, meu problema agora é implementar o método get condicional. Já procurei em muitos lugares orientações
de como se implementar esse método mas não encontrei nenhuma direção. Sei como ele funciona, só não sei como implementá-lo no lado servidor.
Aos que puderem me ajudar, segue o código que já implementei.

Classe HttpRequest.java

package servidorwebmultithread;

import java.io.*;
import java.net.*;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */



/**
 *
 * @author cristiane
 */
public class HttpRequest implements Runnable{
    
    Socket socket;
    static String nomeArquivo = null;

    public HttpRequest(Socket socket) throws Exception{
        this.socket = socket;

    }

    public void run() {
        try{
            processRequest();
        }catch(Exception e){
               Logger.getLogger(WebServer.class.getName()).log(Level.SEVERE, null, e);
        }
    }


    private void processRequest() throws Exception{
        InputStreamReader input = new InputStreamReader(socket.getInputStream());
        DataOutputStream output = new DataOutputStream(socket.getOutputStream());

        BufferedReader entradaDoCliente = new BufferedReader(input);

        String linhaRequisicao = entradaDoCliente.readLine();

        StringTokenizer tokens = new StringTokenizer(linhaRequisicao);
        tokens.nextToken();
        //Captura o nome do arquivo
        nomeArquivo = tokens.nextToken();
        //É necessário acrescentar um . ao nome do arquivo para dizer que este está no diretório atual
        nomeArquivo = "." + nomeArquivo;

        //Abrir o arquivo requisitado
        FileInputStream inputArquivo = null;
        Boolean arquivoExiste = true;

        try{
            inputArquivo = new FileInputStream(nomeArquivo);
            }catch(FileNotFoundException e){
                arquivoExiste = false;
            }

        //Mensagem de Resposta
        String linhaStatus = null;
        String linhaContentType = null;
        String corpoEntidade = null;
        if(arquivoExiste){
            linhaStatus = "HTTP/1.1 200 OK" + "\r\n";
            linhaContentType = "Content-type: " + contentType(nomeArquivo) + "\r\n";

        }else{
            linhaStatus = "HTTP/1.1 404 Not Found" + "\r\n";
            linhaContentType = "Content-Type: text/html" + "\r\n";
            corpoEntidade = "<HTML><HEAD><TITLE>Objeto Não Encontrado</TITLE></HEAD> " +
                    "&lt;BODY&gt;&lt;h1&gt;<b>Not Found</b>&lt;/h1&gt;<br><br>Objeto Não Encontrado&lt;/BODY&gt;&lt;/HTML&gt;";
        }

        //Enviar a linha de Status
        output.writeBytes(linhaStatus);

        //Enviar Linha de Content-Type
        output.writeBytes(linhaContentType);

        //Enviar linha em branco para marcar o fim das linhas de cabeçalho
        output.writeBytes("\r\n");

        //Enviar Corpo da Entidade
        if(arquivoExiste){
            sendBytes(inputArquivo, output);
            inputArquivo.close();
        }else{
            output.writeBytes(corpoEntidade);
        }




        /*/Exibe a linha de requisição
        System.out.println();
        System.out.println(linhaRequisicao);

        //Exibe as linhas de cabeçalho
        String linhasCabecalho = null;
        while((linhasCabecalho = entradaDoCliente.readLine()).length() != 0){
            System.out.println(linhasCabecalho);
        }*/

        //Fecha as cadeias e o socket
        output.close();
        input.close();
        socket.close();

        }

    private static void sendBytes(FileInputStream inputArquivo, OutputStream output) throws Exception{
      //Buffer de 1K para comportar os bytes no caminho para o socket
        byte[] buffer = new byte[1024];
        int bytes = 0;
        //Cópia do arquivo requisitado dentro da cadeia do socket
        while((bytes = inputArquivo.read(buffer)) != -1){
            output.write(buffer, 0, bytes);
        }
    }

    private static String contentType(String nomeArquivo){

        if(nomeArquivo.endsWith(".htm") || nomeArquivo.endsWith(".html")){
            return "text/html";
        }
        if(nomeArquivo.endsWith(".jpeg")){
            return "image/jpeg";
        }
        if(nomeArquivo.endsWith(".jpg")){
            return "image/jpg";
        }
        if(nomeArquivo.endsWith("gif")){
            return "image/gif";
        }
        return "application/octet-stream";

    }
}

Classe WebServer.java

package servidorwebmultithread;

import java.net.*;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author cristiane
 */
public final class WebServer {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception{

        //Definição de porta
       int porta = 1225;

       //Estabelecimento de socket para escuta
       ServerSocket welcomeSocket = new ServerSocket(porta);

       while(true){
        Socket socketConexao = welcomeSocket.accept();

        //Objeto para processar a mensagem de requisição HTTP
        HttpRequest requisicao = new HttpRequest(socketConexao);
        Thread thread = new Thread(requisicao);

        //Iniciar a thread
        thread.start();

        
       }




    }

}

Desde já, muito obrigada..

Criado 28 de setembro de 2011
Respostas 0
Participantes 1