Toon posts:

[JAVA] classes en structuur

Pagina: 1
Acties:

Verwijderd

Topicstarter
Dag mensen,

ik heb een klein probleem bij het maken van een MultiClient Serverprogramma.

Het programma dat ik maak listent dmv een ServerSocket op een bepaalde port en voor welke connectie die binnenkomt, wordt er een CommunicatieThread aangemaakt.

In die CommunicatieThread wordt weer een Protocol klasse aangeroepen. Dit is allemaal gedaan zoals op java.sun.com beschreven staat in het voorbeeld van het KnockKnockProtocol. Dit Protocol behandelt datgene wat binnenkomt en datgene wat er weer uit moet...

Naar aanleiding van wat er binnenkomt, moet er weer een opdracht gestart worden, ook dit zal in de vorm van een CommandThread zijn.

Nu moet het echter mogelijk zijn voor elk volgende client die inlogt informatie uit die CommandThread te halen.

Het zit dus zo, de eerste 3 dingen zijn al geprogrammeerd:

-> Main programma die op port listent

-> Voor elke nieuwe connectie wordt een CommunicatieThread geopend

-> In die CommunicatieThread wordt de afwisseling tussen de server en de client gedaan aan de hand van een protocol klasse...

-> De Protocol klasse moet echter een object (CommandThread) gaan aanmaken, waarvan de variabele in elk volgende CommunicatieThread weer aanspreekbaar is. Ook mag de CommandThread niet verloren gaan als de CommunicatieThread wordt geclosed.

De moeilijkheid zit het em voor mij in het laatste.... hoe maak ik die CommandThread in elke volgende CommunicatieThread weer aanspreekbaar...

In PHP heb je $GLOBALS waar je zoiets in kwijt kan... ik weet niet hoe dit bij Java in zijn werk gaat. In Java heb ik dmv dit board al iets gelezen over Singletons, maar volgens mij is dat toch niet de methode voor dit probleem...

Hier zijn de scripts die ik tot nu toe heb

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.IOException;

public class FTCServer {
    
    ServerSocket serverSocket = null;
    Socket clientSocket = null;
    
    public static void main(String args[]) {
        System.out.println("Opening server socket");
        try {
            serverSocket = new ServerSocket(65155);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 65155.");
            System.exit(-1);
        }
        System.out.println("Listening..");
        while (true) {
            clientSocket = serverSocket.accept();
            new FTCThread (clientSocket);
        }
        serverSocket.close();
    }
}


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
import java.net.*;
import java.io.*;

public class FTCThread extends Thread {
    private Socket socket = null;

    public FTCThread(Socket socket) {
        this.socket = socket;
    }

    public void run() {

        try {
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(
                        new InputStreamReader(
                        socket.getInputStream()));
            
            FTPTransferCommanderProtocol ftcp = new FTPTransferCommanderProtocol();
            
            String inputLine, outputLine;
            
            while ((inputLine = in.readLine()) != null) {
                outputLine = ftcp.processInput(inputLine);
                
                out.println(outputLine);
                if (outputLine.equals("BYE")) {
                    break;
                }
            }
            out.close();
            in.close();
            socket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


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
import com.sharper.ftp.*;

public class FTPTransferCommanderProtocol {
    
    // protocol variabele
    private static final int WAITING = 0;
    private static final int READY = 1;
    private static final int NEW_TRANSFER = 2;
    private static final int ABORT_TRANSFER = 2;
    private static final int GET_STATUS = 2;
    
    private int status;
    private int transferID;
    
    // FTP variabele
    String port = null;
    FTPClient ftpTo;
    FTPClient ftpFrom;
    FTPReply reply;
    boolean login;
    
    public FTPTransferCommanderProtocol () {
        status = WAITING;
    }
    
    public String processInput(String input) {
        String output;
        if (status==WAITING) {
            if (input.equals("READY\r\n")) {
                // moet nog, ip controle
                status = READY;
                output = input;
                return output;
            } else {
                output="ERROR\r\n";
                return output;
            }
        } else if (status==READY) {
            if (input.equals("NEW TRANSFER")) {
                status = NEW_TRANSFER;
                output = input;
                return output;
            } else if (input.equals("ABORT TRANSFER")) {
                status = ABORT_TRANSFER;
                output = input;
                return output;
            } else if (input.equals("GET STATUS")) {
                status = GET_STATUS;
                output = input;
                return output;
            } else {
                output="ERROR\r\n";
                return output;
            }
        } else if (status==NEW_TRANSFER) {
            if (input.substring(0,3).equals("ID=")) {
                String transferSID = input.substring(3);
                transferID.getInteger(transferSID);
                if (transfer[transferID]) {
                    output="ID ERROR; ID ALREADY EXISTS";
                } else {
                    output="ID RECEIVED; ID=" . transferSID;
                }
            } else if (input.substring(0,9).equals("TRANSFER=")) {
                
            }   
        }
    }
}


Hopelijk kan iemand mij helpen!

Met vriendelijke groet,

Fred

  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 01-05 18:22

jAnO!

lalalavanillevla

Ik zou zeggen lees hoofdstuk 13 van het boek thinking in Java 3d edition van Bruce Eckel. Is te downen op www.mindview.net/Books/TIJ/

correctie: lees het hele boek.... Afbeeldingslocatie: http://i.imdb.com/Photos/CMSIcons/emoticons/jumping/jump4.gif

[ Voor 76% gewijzigd door jAnO! op 12-02-2004 16:34 ]

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 15-05 15:27
In PHP heb je $GLOBALS waar je zoiets in kwijt kan... ik weet niet hoe dit bij Java in zijn werk gaat. In Java heb ik dmv dit board al iets gelezen over Singletons, maar volgens mij is dat toch niet de methode voor dit probleem...
Je zou iets met statics kunnen proberen. ( Bijvoorbeeld een static Vector waar je de Communicator Threads in stopt zodat je ze overal weg kunt bereiken ).

Voorbeeldje:

als globale variabele in een klasse definieren:
public static Vector communicatorThreadVector = new Vector();
en vervolgens benaderen met:
KlasseNaam.communicatorThreadVector;

Netter is het om dat ding private te maken en dan een public get methode te maken.

private static Vector communicatorThreadVector = new Vector();
en
public static Vector getCommunicatorThreadVector(){
return communicatorThreadVector;
}

en dan krijg je dus KlasseNaam.getCommunicatorThreadVector();

[ Voor 42% gewijzigd door Donderwolk op 12-02-2004 16:55 ]

Pwnd


Verwijderd

Topicstarter
bedankt voor de hulp, mijn oplossing vond ik hier:

http://java.sun.com/docs/.../javaOO/innerclasses.html

Bedankt voor de hulp :)