Toon posts:

[Java] Uitleg over code na runnen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste allemaal,

Ik probeer een programmaatje voor een webserver te runnen. Het compilen is al foutloos gegaan, alleen met het runnen krijg ik de volgende meldingen en ik heb geen idee wat ze betekenen:

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
C:\Program Files\JDeveloper\jdk\bin\javaw.exe -ojvm -classpath
 C:\HES\NBC\oefening1\Project1\classes;
C:\Program Files\JDeveloper\jdev\lib\
jdev-rt.jar mypackage1.TCPserver 
java.net.BindException: Address in use: JVM_Bind

    void java.net.PlainSocketImpl.socketBind(java.net.InetAddress, int)

        native code

    void java.net.PlainSocketImpl.bind(java.net.InetAddress, int)

        PlainSocketImpl.java:452

    void java.net.ServerSocket.<init>(int, int, java.net.InetAddress)

        ServerSocket.java:170

    void java.net.ServerSocket.<init>(int)

        ServerSocket.java:82

    void mypackage1.TCPserver.main(java.lang.String[])

        ClassStringTokenizer.java:14

Exception in thread main
Process exited with exit code 1.



Kan iemand me uitleggen wat dit betekent? :?

[ Voor 8% gewijzigd door Verwijderd op 03-05-2004 19:43 ]


Verwijderd

De opgegeven poort is al in gebruik, waarschijnlijk door een andere thread of applicatie. Probeer je socket eens naar een andere poort te laten luisteren.

Verwijderd

Topicstarter
Zow jij bent snel! _/-\o_ Ik ga t even proberen.

edit: leidt je dat af uit: java.net.BindException: Address in use: JVM_Bind?
Ik heb namelijk nu de ServerSocket een nieuw poortnummer gegeven en de fout is nog steeds hetzelfde... :/

[ Voor 67% gewijzigd door Verwijderd op 03-05-2004 19:48 ]


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
initialiseer je niet 2 keer een TCPserver class met dezelfde parameters?

Of doe je 2 keer een socketBind?

[ Voor 20% gewijzigd door zneek op 03-05-2004 19:54 ]


Verwijderd

Topicstarter
Ik zal even de code laten zien, ik heb mijn code aangepast aan die van iemand anders dus daar zou de fout wel eens kunnen liggen:

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package mypackage1;

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



class TCPserver {
private static ServerSocket serverSocket;

     public static void main(String[] args) throws IOException {

        ServerSocket portlistener = new ServerSocket(80);
        while (true) {
        try{
            Socket s=serverSocket.accept();  
            new TCPclient(s);
           }

           catch (Exception x) {
        System.out.println(x);
      }
    }
  }
}


class TCPclient extends Thread {
  private Socket socket;

  public TCPclient(Socket s) {
    socket=s;
    start();
}


public void run() {
    try {
            
            InputStreamReader socketstream =  new InputStreamReader(socket.getInputStream());
            BufferedReader socketbuffer = new BufferedReader(socketstream);
            String s=socketbuffer.readLine();
            System.out.println(s);

            String filename="";
            StringTokenizer st=new StringTokenizer(s);
            try {

                  // Parse the filename from the GET command
                  if (st.hasMoreElements() && st.nextToken().equalsIgnoreCase("GET")
                      && st.hasMoreElements())
                    filename=st.nextToken();
                  else
                    throw new FileNotFoundException();  // Bad request


                  // Append trailing "/" with "index.html"
                  if (filename.endsWith("/"))
                    filename+="index.html";


                  // Remove leading / from filename
                  while (filename.indexOf("/")==0)
                    filename=filename.substring(1);


                  // Replace "/" with "\" in path for PC-based servers
                  filename=filename.replace('/', File.separator.charAt(0));


                  // Check for illegal characters to prevent access to superdirectories
                  if (filename.indexOf("..")>=0 || filename.indexOf(':')>=0
                      || filename.indexOf('|')>=0)
                    throw new FileNotFoundException();

                  // If a directory is requested and the trailing / is missing,
                  // send the client an HTTP request to append it.  (This is
                  // necessary for relative links to work correctly in the client).
                  if (new File(filename).isDirectory()) {
                    filename=filename.replace('\\', '/');
                    System.out.print("HTTP/1.0 301 Moved Permanently\r\n"+
                      "Location: /"+filename+"/\r\n\r\n");
                    System.out.close();
                    return;
                    }

  // Open the file (may throw FileNotFoundException)
        InputStream f=new FileInputStream(filename);

        // Determine the MIME type and print HTTP header
        String mimeType="text/plain";
        if (filename.endsWith(".html") || filename.endsWith(".htm"))
          mimeType="text/html";
        else if (filename.endsWith(".gif"))
          mimeType="image/gif";
        System.out.print("HTTP/1.0 200 OK\r\n"+
          "Content-type: "+mimeType+"\r\n\r\n");

        // Send file contents to client, then close the connection
        byte[] a=new byte[4096];
        int n;
        while ((n=f.read(a))>0)
          System.out.write(a, 0, n);
        System.out.close();
      }
      catch (FileNotFoundException x) {
        System.out.println("HTTP/1.0 404 Not Found\r\n"+
          "Content-type: text/html\r\n\r\n"+
          "<html><head></head><body>"+filename+" not found</body></html>\n");
        System.out.close();
      }
    }
    catch (IOException x) {
      System.out.println(x);
    }
  }
}

  • nxt
  • Registratie: November 2001
  • Laatst online: 04-02 09:36

nxt

de fout zit niet in de code, maar zoals Cheatah als zij,
je opent in je applicatie een serversocket op poort 80
maar die is al in gebruik (heb je niet al een applicatie/service/... draaien die die poort gebruikt?).

nog een tip,
je doet bij het opvangen van de exceptions
Java:
1
        System.out.println(x);

als je dat nu eens vervangt door
Java:
1
        x.printStackTrace();

dan kun je ook zien in welk try/catch blok de exception gegooid wordt.

Verwijderd

Topicstarter
Als ik em nu run blijft ie dit zeggen:

code:
1
2
3
4
5
java.lang.NullPointerException

    void mypackage1.TCPserver.main(java.lang.String[])

        ClassStringTokenizer.java:17


Alsof ie in een loop zit.. :/

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 25-05 17:33
Die nullpointer komt doordat er naar een niet bestaand object wordt verwezen.

Klopt het dat je twee ServerSockets wilt hebben?
Ik zie op regel 10:
code:
1
private static ServerSocket serverSocket;

Maar op regel 14 gebruik je:
code:
1
ServerSocket portlistener = new ServerSocket(80);

En daarna gebruik je portlistener niet meer op regel 17, maar serverSocket.

Verwijderd

Topicstarter
Ok bedankt ik krijg geen meldingen meer!! _/-\o_ :)

Verwijderd

code:
1
2
3
4
  public TCPclient(Socket s) {
    socket=s;
    start();
}


Het is niet een goed idee een thread zichzelf te laten starten. Dit kun je toch gewoon op dezelfde plaats doen als waar je de nieuwe thread maakt? :?
Pagina: 1