Toon posts:

[java] webserver probleempje

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig een simpele webserver te maken in java. Ik heb hem nu zover dat hij een html bestand naar bv internet explorer kan sturen op verzoek daarvan van de browser. Het probleem is hij niet 'stopt' met sturen denk ik want IE blijft bezig totdat ik de server stop,daarna zie je meteen heel de pagina. Ik kan het ook voor elkaar krijgen door in plaats van 'while (true)'...'while(test)' te doen. En test is dan aan het einde van de while false...maar dan sluit die ook meteen de server weer af. Maar ik wil dus dat de server continue blijft draaien...hoe moet dat...ik zie iets over het hoofd maar wat?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import java.io.*;
import java.net.*;
import java.util.*;

class Server{

    public static void main(String argv[]) throws Exception
    {
    
    System.out.println("Webserver, klaar voor gebruik...");

    ServerSocket listenSocket = null;
    
    try {
        listenSocket = new ServerSocket(5001);
    }
    catch(Exception e) {
        System.out.println( "Kon de server socket niet aanmaken: Exception: " + e );
        System.exit(1);    
    }

    while (true) {
        System.out.println("Wachten op connectie van client.");
        try { 

        String requestMessageLine;
        String filename;

        Socket connectionSocket = listenSocket.accept();
        BufferedReader inFromClient = 
            new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
        DataOutputStream outToClient = 
            new DataOutputStream(connectionSocket.getOutputStream());
        requestMessageLine = inFromClient.readLine();
        StringTokenizer tokenizedLine = 
            new StringTokenizer(requestMessageLine);
        if (tokenizedLine.nextToken().equals("GET")){
            filename = tokenizedLine.nextToken();
            if (filename.startsWith("/") == true)
                filename = filename.substring(1);
            File file = new File(filename);
            int numOfBytes = (int)file.length();
            FileInputStream inFile = new FileInputStream(filename);
            byte[] fileInBytes = new byte[numOfBytes];
            inFile.read(fileInBytes);
            outToClient.writeBytes("HTTP/1.0 200 Document Follows\r\n");
            if(filename.endsWith(".jpg"))
                outToClient.writeBytes("Content-Type: image/jpeg\r\n");
            if(filename.endsWith(".gif"))
                outToClient.writeBytes("Content-Type: image/gif\r\n");
            outToClient.writeBytes("Content-Length: " + numOfBytes + "\r\n");
            outToClient.writeBytes("\r\n");
            outToClient.write(fileInBytes, 0, numOfBytes);
            connectionSocket.close();
            
        }
        else System.out.println("Bad Request Message");
    }
    catch (Exception e) {
            System.out.println("Connectie met client verbroken.");
        }
}
    
        

    }
}

Verwijderd

Topicstarter
kan iemand de topic titel veranderen naar '[java] webserver probleempje' ?

Verwijderd

Probeer eens eerst de inputstream en de outputstream te closen voor je de socket closed. En sluit ook de socket in je catch statement, dan sluit ie de socket ook nog als er iets anders misgaat dan dat de socket onverhoeds gesloten is.

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 16-08 19:14

Eelke Spaak

- Vlad -

Ik weet niet precies wat je met deze server wil, maar als je wil dat 'ie uberhaupt meerdere clients aankan moet je iets van threading implementeren. Waarschijnlijk zit daar ook het probleem waar je nu mee zit.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
while (true)
{
try
{
 Socket s = listenSocket.accept();
 new ClientThread(s).start();
}
catch (Exception e)
{
 System.out.println("Foutje!");
}
}

class ClientThread extends Thread
{
 private Socket clientSocket;

 public ClientThread(Socket clientSocket)
 {
  this.clientSocket = clientSocket;
 }

 public void run()
 {
  // handel hier client af
 }
}

TheStreme - Share anything with anyone


Verwijderd

Topicstarter
Nou ik wil gewoon dat die het bestand verstuurt en vervolgens weer wacht totdat een browser een file vraagt. Dus dat ie weer op het scherm geeft 'Wacht op connectie client'

Verwijderd

Topicstarter
Hij doet het nu beter. Alleen zie mijn screenshot...hij loopt 1 x de try door waar hij het gevraagde bestand stuurt. Dat klopt tot zover maar daarna krijgt hij schijnbaar een paar x een connectie die weer afbreekt.

Afbeeldingslocatie: http://members.lycos.nl/marktap/cmd.jpg

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import java.io.*;
import java.net.*;
import java.util.*;

class Server{

    public static void main(String argv[]) throws Exception
    {
    
    System.out.println("Webserver, klaar voor gebruik...");

    ServerSocket listenSocket = null;
    Socket connectionSocket = null;
    
    try {
        listenSocket = new ServerSocket(5001);
    }
    catch(Exception e) {
        System.out.println( "Kon de server socket niet aanmaken: Exception: " + e );
        System.exit(1);    
    }

    BufferedReader inFromClient = null;
    DataOutputStream outToClient = null;
    int test = 0;

    while (true) {
        System.out.println("Wachten op connectie van client.");
        try { 

        String requestMessageLine;
        String filename;
        
        connectionSocket = listenSocket.accept();
        
        inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
        outToClient = new DataOutputStream(connectionSocket.getOutputStream());
        
        requestMessageLine = inFromClient.readLine();
        StringTokenizer tokenizedLine = 
            new StringTokenizer(requestMessageLine);
        if (tokenizedLine.nextToken().equals("GET")){
            filename = tokenizedLine.nextToken();
            if (filename.startsWith("/") == true)
                filename = filename.substring(1);
            File file = new File(filename);
            int numOfBytes = (int)file.length();
            FileInputStream inFile = new FileInputStream(filename);
            byte[] fileInBytes = new byte[numOfBytes];
            inFile.read(fileInBytes);
            outToClient.writeBytes("HTTP/1.0 200 Document Follows\r\n");
            if(filename.endsWith(".jpg"))
                outToClient.writeBytes("Content-Type: image/jpeg\r\n");
            if(filename.endsWith(".gif"))
                outToClient.writeBytes("Content-Type: image/gif\r\n");
            outToClient.writeBytes("Content-Length: " + numOfBytes + "\r\n");
            outToClient.writeBytes("\r\n");
            outToClient.write(fileInBytes, 0, numOfBytes);
            //outToClient.close();
            //inFromClient.close();
            connectionSocket.close();
            test = test + 1;
            System.out.println("test: " + test);
            
        }
        else System.out.println("Bad Request Message");
    }
    catch (Exception e) {
            //outToClient.close();
            //inFromClient.close();
            connectionSocket.close();
            System.out.println("Connectie met client verbroken.");
        }
}
    
        

    }
}

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 14:22
Extra connecties die niets doen....so what :)

Misschien kun je ook een flush doen, vlak voordat je de connectie sluit. Straks heeft hij nog wat data in de wachtrij waarop hij wacht dat ze verzonden worden. (maar door die close niet verzonden worden).

Ik heb ook een keer een webservertje geschreven (C++) maar dat was best wel *****. Zeker als het maar hele kleine foutjes zijn. :(

let the past be the past.


Verwijderd

Topicstarter
Sorry mensen, tis opgelost. Stom stom....in de html file die ik opvroeg zat ook een css en wat plaatjes en daar maakte hij elke keer ook connectie voor. Stom dat ik daar niet aan gedacht heb :)

in ieder geval bedankt!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
mocht je het wat beter willen doen dan moet je kijken naar de NIO libs. Die werken vele malen beter...
Pagina: 1