Avatar billede iraq_eyes Nybegynder
11. marts 2008 - 21:58 Der er 10 kommentarer

Web server

Jeg har fået en opgave der lyder sådan:

Formål.

Kod en flere trådet server.
Udover øvelse med socket og tråde i java opnås et vist praktisk kendskab til HTTP-protokollen.
Kursusarbejdet må godt antage en eksperimentel form.

Mål.

• En kørende flere trådet server, der fungerer som simpel WEB-server.
• En kortfattet teknisk rapport dækkende hvad der er afprøvet og om eventuelle erfaringer/problemer.

Opgaven som kan danne ramme for arbejdet.

Flertrådet server.

Konstruer en flere trådet simpel web-server. Serveren skal kunne tilgås af en standard Browser – f.eks. IE, via en socket-grænseflade. Serveren skal svare Browseren med standard status koder. Serveren skal kunne findes på porten 8888.
Statuskoder som serveren skal kunne klare at returnere er 200 og 404. Derudover kan eksperimenteres med koderne 307 og 301.
Dette indebærer at serveren skal kunne sende data/header-linier der matcher statuskoderne. Af filer serveren kan sende tilbage, kan 2 eller få være nok. En default fil (som index.html) skal sendes tilbage hvis ikke browseren (brugeren) angiver et navn i stien.

Vores lærer har givet et hint der består af disse tre klasser, som skal bruges til løsning:

Server:

import java.io.*;
import java.net.*;

public class MultiEchoServer
{
private static ServerSocket servSocket;
private static final int PORT = 1234;

public static void main(String[] args) throws IOException
{
try
{
servSocket = new ServerSocket(PORT);
}
catch (IOException e)
{
System.out.println("\nUnable to set up port!");
System.exit(1);
}

do
{
//Wait for client...
Socket client = servSocket.accept();

System.out.println("\nNew client accepted.\n");

//Create a thread to handle communication with
//this client and pass the constructor for this
//thread a reference to the relevant socket...
ClientHandler handler = new ClientHandler(client);

handler.start();//As usual, this method calls run.
}while (true);
}
}



ClientHandler:

class ClientHandler extends Thread
{
private Socket client;
private BufferedReader in;
private PrintWriter out;

public ClientHandler(Socket socket)
{
//Set up reference to associated socket...
client = socket;

try
{
in = new BufferedReader(
new InputStreamReader(
client.getInputStream()));
out = new PrintWriter(
client.getOutputStream(),true);
}
catch(IOException e)
{
e.printStackTrace();
}
}

public void run()
{
try
{
String received;
do
{
//Accept message from client on
//the socket's input stream...
received = in.readLine();

//Echo message back to client on
//the socket's output stream...
out.println("ECHO: " + received);

//Repeat above until 'QUIT' sent by client...
}while (!received.equals("QUIT"));
}

catch(IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if (client!=null)
{
System.out.println(
"Closing down connection...");
client.close();
}
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
}


Client:

import java.io.*;
import java.net.*;

public class MultiEchoClient
{
private static InetAddress host;
private static final int PORT = 1234;
private static Socket link;
private static BufferedReader in;
private static PrintWriter out;
private static BufferedReader keyboard;

public static void main(String[] args) throws IOException
{
try
{
host = InetAddress.getLocalHost();
link = new Socket(host, PORT);
in = new BufferedReader(
new InputStreamReader(
link.getInputStream()));
out = new PrintWriter(
link.getOutputStream(),true);

keyboard = new BufferedReader(
new InputStreamReader(System.in));

String message, response;
do
{
System.out.print(
"Enter message ('QUIT' to exit): ");
message = keyboard.readLine();


//Send message to server on
//the socket's output stream...
out.println(message);

//Accept response from server on
//the socket's input stream...
response = in.readLine();

//Display server's response to user...
System.out.println(response);
}while (!message.equals("QUIT"));
}
catch(UnknownHostException uhEx)
{
System.out.println(
"\nHost ID not found!\n");
}
catch(IOException ioEx)
{
ioEx.printStackTrace();
}
finally
{
try
{
if (link!=null)
{
System.out.println(
"Closing down connection...");
link.close();
}
}
catch(IOException ioEx)
{
ioEx.printStackTrace();
}
}
}
}

Er der nogen der kan hjælpe??
Avatar billede arne_v Ekspert
11. marts 2008 - 22:15 #1
Det er der sikkert nok.

Altsaa hjaelpe med opgaven - ikke lave opgaven.

Hvor er du koert fast ?
Avatar billede iraq_eyes Nybegynder
11. marts 2008 - 22:39 #2
i de der koder.. faktisk i det hele taget at skulle skrive fra en server til en browser..
Avatar billede arne_v Ekspert
12. marts 2008 - 00:01 #3
serveren laver en ServerSocket som lytter på en bestemt port:

servSocket = new ServerSocket(PORT);

når client connecter så får serveren en Socket:

Socket client = servSocket.accept();

den kan man hente en InputStream og en OutputStream ud af som kan wrappers i
en BufferedReader og en PrintWriter:

n = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream(),true);
Avatar billede iraq_eyes Nybegynder
12. marts 2008 - 00:09 #4
hmm ja men hva så med de der koder 301 404 osv.. I hvilken sammenhæng skal man bruge dem og hvordan?
Avatar billede arne_v Ekspert
12. marts 2008 - 00:43 #5
Avatar billede iraq_eyes Nybegynder
12. marts 2008 - 00:49 #6
ja det ved jeg, problemet er "bare" at jeg ikke ved hvordan jeg skulle bruge den i denne sammenhæng, aktså den kode der siger filen er ikke fundet hvornår skal den komme frem? Hvad skal klienten gøre så den kommer frem? Og hvad skal serveren gøre for det?
Avatar billede arne_v Ekspert
12. marts 2008 - 01:17 #7
Som jeg læser opgaven er client side bdeøvende ligegyldig.

Du kan bruge et client program som bare dumper alt den modtager eller du kan bruge
en web browser som klient.

Det vigtige er server koden og at den returnerer den rette status kode for
forskellige requests.
Avatar billede iraq_eyes Nybegynder
12. marts 2008 - 09:34 #8
Ok og hvordan : "og at den returnerer den rette status kode for
forskellige requests"?
Men når du siger request betyder det så ikke at der er en bruger der gør noget og derfra får man request??
Avatar billede arne_v Ekspert
13. marts 2008 - 02:23 #9
Client program eller en browser sender en HTTP request til serveren.

Serveren sender en HTTP response tilbage hvor der indgår en status som angiver
om dokumentet blev fundet eller hvilken fejl der skete.
Avatar billede riversen Nybegynder
13. marts 2008 - 06:13 #10
et lille kig på rfc'en for http kunne måske også være en ide
http://www.rfc-editor.org/cgi-bin/rfcdoctype.pl?loc=RFC&letsgo=2616&type=ftp&file_format=txt
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester