Java sockets, applet en objecten

Pagina: 1
Acties:

  • Mikey NL
  • Registratie: Februari 2004
  • Laatst online: 19-10 09:57
Ik ben in Java een chatbox met sockets aan het bouwen, maar nu loop ik tegen een probleempje aan.

Eerst liet ik via de sockets gewoon plain text verzenden, maar omdat ik het nu toch wat geavanceerder wil maken wilde ik graag proberen om objecten (Strings voorlopig, welke dus Serializible zijn).

In de serverapp staat onder andere de volgende code
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
...
server = new ServerSocket(socketport);
...
acceptClientsThread = new Thread() {
    public void run(){
        while(true){
            listenSocket();
        }
    }
};
acceptClientsThread.start();
        

acceptMessages = new Thread() {
    public void run(){
        while(true){
            getNextMessage();
        }
    }
};
acceptMessages.start();

....

public void listenSocket(){
    Socket client = null;
        
    //checken of er nieuwe clients zijn
    try{
        client = server.accept();
        addClient(client);
        System.out.println("Nieuwe client verbonden!");
    }
    catch(IOException e){
        System.err.println("Fout bij verbinden met client");
    }
}

public void getNextMessage(){
    try{
        client = (Socket)clients.nextElement();
        if(client.getInputStream().available() > 0){ //checken of er bytes zijn om op te halen
            ObjectInputStream in = new ObjectInputStream(client.getInputStream());
            String message = (String)in.readObject();
            if(message != null){
                broadcastMessage(message);
                System.err.println("Nieuw bericht ontvangen en verstuurd: "+message);
            }
        }
    }
    catch(Exception e){
        // Problem with a client, close and remote it
        try {
            if (client != null) client.close();
            System.out.println("Client verlaat de chatroom");
        }
        catch (Exception ignored) { }
        socketClients.removeElement(client);
    }
}


Er wordt dus een thread gestart voor het ontvangen van nieuwe clients en er wordt een thread gestart voor het ontvangen van berichten. De clients worden opgeslagen in een Vector bij het openen van een verbinding.

Bij de client (een applet) gebeurd bijna hetzelfde, maar dan een normaal socket en niet een ServerSocket.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void connectServer(){
    try {
        // Connect to the server if we haven't before
        if(in == null){
            Socket server = new Socket(getCodeBase().getHost(), socketport);
            //Socket server = new Socket("localhost", socketport);
            
            out = new ObjectOutputStream(server.getOutputStream());             
            in = new ObjectInputStream(server.getInputStream());
                
            System.out.println("Verbinding gemaakt met de server");
        }
    }
    catch (SocketException e) {
        // Can't connect to host, report it and wait before trying again
        System.out.println("Kan niet verbinden met de server: " + e.getMessage());
        in = null;
    }
    catch (Exception e) {
        // Some other problem, report it and wait before trying again
        System.out.println("Foutmelding: " + e.getClass().getName() + ": " + e.getMessage());
    }
}


Nu blijft de applet "hangen" op het initialiseren van de ObjectInputStream. Als ik die weghaal wordt de applet correct uitgevoerd, dus de ObjectOutputStream werkt wel gewoon.

Eerst deed ik dus gewoon text versturen via een printwriter en dat werkte prima, maar met Objecten is natuurlijk veel meer mogelijk. Ik heb al rondgezocht op internet, maar ik krijg eigenlijk alleen maar andere problemen te zien met appet en sockets.

Is er iets wat ik over het hoofd zie? De server draait op localhost en ik roep de applet ook aan via localhost.

Ik krijg de melding
code:
1
System.out.println("Nieuwe client verbonden!");

wel te zien op het outputvenster van de server, het maken van de verbinding werkt wel. Maar het initialiseren van de ObjectInputStream dus niet.

De volledige code van de client en de code van de server