Ho scritto due classi una che funge da server web e una che si comporta come un browser (ma stampa semplicemente il codice html come una stringa senza interpretarlo), ovviamente entrambe ben lontane da un vero server ed un vero browser, sto solo provando le comunicazioni HTTP via socket.
Se avvio il server e provo a contattarlo con Firefox ottengo una risposta corretta, ovvero una semplicissima pagina html.
Se nel codice del browser che ho scritto metto l'indirizzo di un qualsiasi sito online e lo avvio, ottengo correttamente il codice html della pagina.
Da questo capisco che da sole le 2 classi funzionano.
Il problema nasce se avvio la mia classe "server" e poi la classe "browser" in cui specifico l'indirizzo del mio server, in tal caso l'output che ottengo, invece del codice html, è la stringa presente nel codice del browser
codice:
GET / HTTP/1.1\r\n\r\n
Entrambe le classi le ho sotto lo stesso progetto su Eclipse e da lì ne avvio prima una (il server) e poi l'altra (il browser).
Ho anche provato a farle partire da riga di comando in 2 terminali diversi in Ubuntu, stessa storia.
Per quale motivo tra di loro non funzionano?
Qui il codice delle 2 classi, così potete vedere se c'è qualcosa che no va o se volete fare delle prove.
Server
codice:
import java.net.*;
import java.io.*;
public class SimpleWebServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
System.err.println("Could not listen on port: 4444.");
System.exit(1);
}
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
{
System.out.println(inputLine);
if (inputLine.equals("Connection: keep-alive")) break;
}
String message = new String(args[0]);
out.println("HTTP/1.1 200 ok\r\n");
out.println("<html>");
out.println("<head>");
out.println("<title> index </title>");
out.println("</head>");
out.println("<body>");
out.println("<p><b>PIPPO</b></p>");
out.println("</body>");
out.println("</html>");
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
Browser
codice:
import java.io.*;
import java.net.*;
public class SocketSimpleWebBrowser {
public static void main(String[] args) throws IOException {
Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
echoSocket = new Socket("localhost", 4444);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(
new InputStreamReader(
echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about the host");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for this connection.");
System.exit(1);
}
out.println("GET / HTTP/1.1\r\n\r\n");
String data;
while ((data = in.readLine()) != null)
{
System.out.println(data);
}
out.close();
in.close();
echoSocket.close();
}
}