• - -

[Guida] Server HTTP

DeletedUser

Ospite
Salve a tutti.

Ho deciso di postare in questo thread un codice JAVA scritto da ME per poter creare un server HTTP.

Partendo con ordine preferisco prima specificare alcune cose per rendere chiaro il codice che andrò a postare successivamente.

Che cos'è JAVA?

JAVA è un linguaggio di programmazione orientato ad oggetti.
(Sembrerebbe che il nome JAVA derivi dall'abitudine dei suoi creatori di andare a prendere il caffè in una piccola isola dell'indonesia. Il tipo di caffè era proprio chiamato java)

Cosa significa orientato ad oggetti?

Orientato ad oggetti significa che questo tipo di linguaggio permette di sviluppare oggetti software in grado di comunicare tra di loro attraverso l'invio di appositi messaggi. Inoltre il linguaggio orientato ad oggetti permette una manutenzione più rapida del codice e permette la creazione anche di interfacce grafiche.

Qual'è il suo utilizzo?

JAVA serve per creare applicazioni WEB e ormai, questo tipo di linguaggio, è onnipresente in qualsiasi programma (o quasi).
Basti pensare che per la creazioni di applicazioni android viene utilizzato questo codice (seppure lievemente modificato).

Che cosa serve il tuo codice? che cos'è un server HTTP?

Il server HTTP (Hyper Text Transfer Protocol) è un tipo di server che fornisce, su richiesta di un utente o client, un file di qualsiasi tipo (come le pagine web). L'insieme di tutti questi server forma il classico WWW ovver Wolrd Wide Web.

Il codice da me scritto permette appunto la creazione di un server per permettere a chi lo desidera di vedere un sito da voi creato senza il bisogno di utilizzare host presenti in internet che siano essi gratis o a pagamento.

Ora posterò il codice e di seguito renderò più chiaro quanto detto.

Prima di tutto per utilizzare java basterebbe un semplice blocco note, ma avrete la necessità di un ambiente di sviluppo serio. Gratuiti ce ne sono molti ma consiglio sempre di utilizzare NetBeans. Ad ogni modo, datemi un paio di giorni, posterò una guida su come scaricare e installare NetBeans.

In seconda parte creiamo tre classi differenti. Che chiameremo

  • Main
  • Server
  • ServerThread

Tutti appariranno con estensione *.java

Prima classe MAIN

Il main sarà la classe che farà funzionare il vostro programma e che voi dovrete far partire con NetBeans.
Questo codice creare semplicemente il vostro server e lo mette in ascolto sulla porta 8080


Codice:
package http_server;

import java.io.*;

/**
 *
 * @author Filippo
 */
public class Main {
    
    public static void main (String args[]) throws IOException{
        
        //Creo server
        Server server = new Server(8080);
        //Metto il server in ascolto
        server.ascolto();
    }
    
}


Seconda classe SERVER

Siccome il codice è articolato e complesso non spiegherò nel dettaglio ogni riga di codice anche perchè è opportunamente commentato per chiarire le idee anche ai meno esperti.
La classe server specificherà dove si trova il vostro sito hostato il locale e dove si trova la vostra index.



Codice:
String directory = "..\\HTML\\";
String index = "index.html";


String Directroy sta ad indicare dove si trovano i vostri file. Nel mio caso nella cartella HTML.
String index invece la index della vostra pagine web.

Specificato questo potrete cambiare anche il numero di richiste massime da supportare e altre piccole cose.
Inoltre è specificata l'intestazione della richiesta HTTP ma che comunque non è da modificare.

Potete decidere anche la porta da utilizzare da 0 a 65535.


Codice:
package http_server;

/**
 *
 * @author Filippo
 */
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.logging.*;
import javax.swing.*;

public class Server {

    private ServerSocket socket;
    private int port = 8080;
    
    //Numero richieste
    private int richiesteMax = 200; 
    
    String directory = "..\\HTML\\";
    String index = "index.html";
    
    //Messaggio di errore
    String errore = "Errore HTTP 404";
    
    Socket sock;
    

    public Server() throws IOException {
        
        socket = new ServerSocket(port, richiesteMax);
        
    }
   
    
    public Server(int porta) throws IOException {
        
        // Controllo se la porta va bene altrimenti inserisco da default la 8080
        port = (porta >= 0 && porta <= 65535) ? porta : port;
        // Creo il socket
        socket = new ServerSocket(port, richiesteMax);
        
    }

    
    public void percorsoDirectory(String dirPath) {
        
        String percorsoDir = "";
        
        for (int i = 0; i < dirPath.length(); i++) {
            
            
            percorsoDir = percorsoDir + dirPath.charAt(i);
            
            // In caso trovi \
            if (dirPath.charAt(i) == '\\') {
                
                // lo riscrivo
                percorsoDir = percorsoDir + dirPath.charAt(i);
                
            }
            
        }
        
        directory = percorsoDir;
    }

    
    // Metto il server in ascolto
    public void ascolto() throws IOException {
        
        System.out.println("Il Server è in ascolto \n");
        
        while (true) {
            
            sock = socket.accept();
            
            // Creo il Thread
            ServerThread thread = new ServerThread(sock, this);
            
            thread.start();
            
        }
        
    }

    
    public String getAnswerFile(String risorsa) {

        String html = "";

        FileInputStream fileStream = null;
        
        try {
            
            // Provo a prendere la risorsa
            fileStream = new FileInputStream(risorsa); 
            
        } catch (FileNotFoundException ex) {
            
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            
        }
        
        Scanner scanner = new Scanner(fileStream);
        
        // Per tutta la lunghezza del file
        while (scanner.hasNext()) {
            
            html += scanner.nextLine() + "\n";
            
        }
        
        try {
            
            fileStream.close();
            
        } catch (IOException ex) {
            
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            
        }
        scanner.close();
        
        // Stringa dell'intestazione
        String pagina = "HTTP/1.1 200 OK\r\n" + "Connection: open\r\n"
                + "Server: Java (Windows)\r\n" + "Content-Lenght:" + html.length()
                + "\r\n" + "Content-Type: text/html\r\n\r\n";
        
        // Ritorno l'intestazione e il file letto
        return pagina + html;    
        
    }

   
    public String readRequest(String request) {
        
        String pathRisorsa = "";
        
        String v[] = request.split(" ");

       // Se trovo GET alla posizione 0
        if (v[0].equals("GET")) {
            
           
            File risorsa = new File(directory + index);
           
            // e se il file posso leggerlo ed esiste
            if (risorsa.canRead() && risorsa.exists()) {
                
                // allora mi costruisco il percorso
                pathRisorsa = risorsa.getPath();
                
                // e lo restituisco
                return pathRisorsa; 
                
            } else {
                
                pathRisorsa = errore;
                
                //altrimenti ti stampo il messaggio 404
                return pathRisorsa;
            }
            
        } 
        
        else {
            
            pathRisorsa = "Errore!";
            
            return pathRisorsa;
            
        }
        
    }

    // Invio il tutto!
    public void sendReply(String resource, DataOutputStream out) {
        
        try {
            
            String s = getAnswerFile(resource);
            
            out.writeBytes(s + '\n');
            
        } catch (IOException ex) {
            
            JOptionPane.showMessageDialog(null, "ERRORE: " + ex);
            
        }
    }
}

La terza e ultima classe è ServerThread

Questa classe permette la creazione del server e gestisce le richieste MULTITHREAD .

Codice:
package http_server;

/**
 *
 * @author Filippo
 */

import java.io.*;
import java.net.*;
import javax.swing.*;

public class ServerThread extends Thread {

    private Socket s;
    private Server server;

    
    public ServerThread() {
        
        s = new Socket();
        
        try {
            
            server = new Server();
            
        } catch (IOException ex) {
            
        }
    }

    // Costruisco il mio server
    public ServerThread(Socket socket, Server mainServer) {
        
        s = socket;
        
        server = mainServer;
        
    }

    @Override
    public void run() {
        
        try {

            // Inizializzo gli stream
            BufferedReader bufferReader = new BufferedReader(new InputStreamReader(s.getInputStream()));
            
            DataOutputStream streamOutput = new DataOutputStream(s.getOutputStream());
            
            String leggo = "";
            
            while(!bufferReader.ready()){}
            
            while (bufferReader.ready()) {
                
               // Finchè il buffer legge lo inserisco nella mia stringa
               leggo += bufferReader.readLine() + "\n";
                
            }
            
            leggo = leggo.split("\n")[0];
            
            //Invio tutto
            server.sendReply(server.readRequest(leggo), streamOutput);
            
            // chiudo lo stream
            streamOutput.close();

        } catch (IOException ex) {
            
            JOptionPane.showMessageDialog(null, "Errore\n");
        }
    }
}

N.B: Una volta eseguito il codice il server si metterà in ascolto. Per visualizzarlo vi basterà andare su un browser e scrivere 127.0.0.1:8080 o un numero diverso a seconda della porta che utilizzerete.

Per farlo visualizzare a dei vostri amici sarà sufficiente comunicare loro il vostro indirizzo IP con la vostra porta e potranno vederlo.
In alternativa, in modo molto più sicuro ed efficente, potrete utilizzare il programma DyDNS che si occuperà di tradurre il vostro indirizzo IP in un nome.

Ad esempio il vostro sito sarà raggiungibile all'indirizzo miosito.ath.cx:8080.

A breve comunque posterò anche una guida su come scaricare e utilizzare DyDNS oppure No-IP

Ho creato questa guida a scopo informativo. Il codice è proprietario e scritto da me, così come le informazioni su JAVA vengono da mie personali esperienze passate sui libri a studiare.

Vi consiglio di utilizzare questo codice per far vedere i vostri report :)

Ho letto spesso di discussioni su ImageShack, limite immagini, la fatica di caricare e scaricare immagini continuamente, caricare 500 file. Roba da matti.
Grazie a questo codice voi mettete le vostre immagini in una cartella, li mettete dentro un file html e li fate vedere a chi volete.


Il file HTML sarà banale e dovrà così apparire.

basta un file blocco note e salvarlo come index.html

Codice:
<html>
<head>
<title>Miei Report</title>
</head>
<body>
<img src="percorsoMioReport.estensione">
</body>
</html>

EDIT: EVITATE LE PORTE 135,445,137-139 che sono potenzialmente pericolose.

EDIT 2: Ecco a voi le altre guide
Guida Installazione NetBeans http://forum.tribals.it/showthread.php?t=19484
Guida Installazione DyDNS http://forum.tribals.it/showthread.php?t=19483
 
Ultima modifica di un moderatore:

DeletedUser36190

Ospite
Ottima guida ;)

Ora non ho tempo di guardare nella documentazione, ma il package server è di default?

Ah, complimenti per non aver utilizzato la awt :D
 

DeletedUser

Ospite
Ottima guida ;)

Ora non ho tempo di guardare nella documentazione, ma il package server è di default?

Ah, complimenti per non aver utilizzato la awt :D

Il nome del package l'ho dato io :)
Puoi chiamarlo come vuoi ^^

Grazie comunque :)
 

DeletedUser36190

Ospite
Ok ;)

Altra cosa: non è rischioso lasciare aperta e così accessibile una porta? Non so esattamente come funzioni questo server, quindi dato che loro scaricano da esso, non possono anche uppare e quindi potenzialmente entrarti nel sistema? E secondo, ovviamente suppongo che funzioni solo quando il pc è acceso, giusto?
 

DeletedUser

Ospite
Ok ;)

Altra cosa: non è rischioso lasciare aperta e così accessibile una porta? Non so esattamente come funzioni questo server, quindi dato che loro scaricano da esso, non possono anche uppare e quindi potenzialmente entrarti nel sistema? E secondo, ovviamente suppongo che funzioni solo quando il pc è acceso, giusto?

Approposito esatto.
Non è pericoloso tenere le porte aperte, o meglio, dipende da quali porte si decidono di utilizzare :)

EVITATE LE PORTE 135,445,137-139 che sono potenzialmente pericolose.

EDIT: Si il server purtroppo rimane acceso solo quando hai acceso il PC :)
 

DeletedUser29511

Ospite
Ora mai per viaggiare bene in internet bisogna avere le porte aperte del modem... Comunque sia le porte per entrare nel pc non è la 8080
 

DeletedUser36190

Ospite
Beh allora pongo anche a voi la questione. Sono giorni che sto cercando di creare uno script in JavaScript che permetta di salvare automaticamente una schermata in una cartella predefinita, in un formato predefinito, con un nome predefinito di tipo sequenziale, e mi servirebbe appunto per i report, e si integrerebbe perfettamente con questa tipologia di server... però ho trovato online solo risposte negative alla mia richiesta, e non riesco anche provandoci ad accedere al comando di Windows per modificarlo e fare ciò... premetto che mi serve per XP, quindi la funzione cattura di vista e 7 non mi è utile.
 

DeletedUser36190

Ospite
Un aiutino? :D
So come funzionano i file batch, ma non ne ho mai fatto uno e quindi non sono pratico dei comandi basilari del dos :D
 

DeletedUser29511

Ospite
Ho fatto ha guida da poco sul cmd... Serviti di quella più google
 

DeletedUser36190

Ospite
Rimane un problema: qual è il comando? Su internet ho trovato solo il collegamento ad una suite da scaricare che però non mi sembra esattamente quello che sto cercando... hai idee? Una volta fatto posto qui, se usato insieme al server HTTP risolve tutti gli attuali problemi di hosting dei report :D

Forse ho trovato qualcosa... vi dirò in seguito
 

DeletedUser

Ospite
Se lo volete e vi interessa posso creare il programma eseguibile.
Voi dovrete solamente inserire il numero della porta desiderato e il programma vi aprirà il Server HTTP senza il bisogno di codice o altro.

Fatemi sapere se può tornarvi utile che ci lavoro su.
 

DeletedUser36190

Ospite
Beh sarebbe comodo, si risparmia tempo... se hai voglia provaci. Nel frattempo ho capito come risolvere il mio problema, ma ho un gap tecnico da colmare abbastanza grande, quindi mi ci vorrà del tempo.
 
In cima