[Java] Client/Server programmaatje vertraagt pc

Status
Niet open voor verdere reacties.

niekfct

Terugkerende gebruiker
Lid geworden
19 jul 2006
Berichten
1.563
Hoi

Voor een project moeten wij een spel maken, en dit doen we in Netbeans. Nu hebben we uitgevogeld hoe we via gedeelde mappen van MSN gelijktijdig op 10km afstand in hetzelfde project kunnen werken. Het enige punt is, dat je allebei in hetzelfde bestand kunt schrijven.

Nu heb ik van een oude simpele client/server chat implementatie de source code zodanig omgeschreven, zodat ik een mooi programmaatje heb dat laat zien welke files op dat moment worden gebruikt (De een klikt op een checkbox met de filenaam, de ander ziet dat en gaat niet in die file werken).
Werkt prima, alleen wordt mijn pc er onmeunig traag van. Ik kan zelf zo snel de bug niet vinden, dus vandaar mijn vraag.

Is er iemand die dit ziet? Hoe kan ik dit verbeteren? (Als dat al kan?:p)

Code:
public class ClassFiles
{

    public static String[] FILES =
    {
      "file1","file2", "file3"
    };
}

Code:
public class Client
{

    private static final String USAGE =
            "usage: java Client <address> <port>";

    /** Start een Client-applicatie op. */
    public static void main(String[] args)
    {
        if (args.length != 2)
        {
            System.out.println(USAGE);
            System.exit(0);
        }
        InetAddress addr = null;
        int port = 0;
        Socket sock = null;
        try
        {
            System.out.print("Serveradres wordt ingelezen..");
            if (args[0] != null)
            {
                addr = InetAddress.getByName(args[0]);
                System.out.println(" Ok.");
            }
            System.out.print("Poort wordt ingelezen..");
            if (args[1] != null)
            {
                port = Integer.parseInt(args[1]);
                System.out.println(" Ok.");
            }

        } catch (UnknownHostException e)
        {
            System.err.println("Er is een fout opgetreden: " + e);
        } catch (NumberFormatException e)
        {
            System.err.println("Voer een geldige poort in!");
        }
        
        // try to open a Socket to the server
        try
        {
            sock = new Socket(addr, port);
        } catch (IOException e)
        {
            System.out.println("ERROR: could not create a socket on " +
                    addr + " and port " + port);
        }

        // create Peer object and start the two-way communication
        try
        {
            Peer client = new Peer(sock);
            Thread streamInputHandler = new Thread(client);
            streamInputHandler.start();
            
            //client.shutDown();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

Code:
public class Peer implements Runnable
{

    protected Socket sock;
    protected BufferedReader in;
    protected BufferedWriter out;
    private Venster v;

    /**
     * Constructor. Construeert een Peer-object met de gegeven naam
     * en de meegegeven sock. Initialiseert de input- en outputstreams.
     * @require (name != null) && (sock != null)
     * @param   naam naam van dit Peer-proces
     * @param   sock Socket van dit Peer-proces
     */
    public Peer(Socket sock) throws IOException
    {
        this.sock = sock;
        this.in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        this.out = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
        v = new Venster(this);
    }

    /**
     * Leest Strings uit de stream van de socket-verbinding en 
     * schrijft deze karakters naar de standard output. 
     */
    public void run()
    {
        while (true)
        {
            try
            {
                String s = "";
                if (in.ready())
                {
                    s = in.readLine();


                    v.process(s);

                }

            } catch (IOException e)
            {
                System.err.println("Er is een foutJE opgetreden: " + e);
                System.exit(0);
            }
        }
    }

    public void stuur(String s)
    {
        try
        {
            this.out.write(s);
            this.out.flush();
        } catch (IOException ex)
        {
        }
    }
}

Code:
public class Server
{

    private static final String USAGE =
            "usage: java Server <name> <port>";

    /** Start een Server-applicatie op. */
    public static void main(String[] args)
    {
        if (args.length != 2)
        {
            System.out.println(USAGE);
            System.exit(0);
        }
        String name = null;
        System.out.print("Naam wordt ingelezen..");
        if (args[0] != null && !(args[0].equals("")))
        {
            name = args[0];
            System.out.println(" Ok.");
        }
        int port = -1;
        try
        {
            System.out.print("Poort wordt ingelezen..");
            port = Integer.parseInt(args[1]);
            System.out.println(" Ok.");
            if (port != -1 && name != null)
            {
                System.out.print("Nieuwe ServerSocket wordt aangemaakt..");
                ServerSocket sSock = new ServerSocket(port);
                System.out.println(" Ok.");
                while (true)
                {
                    System.out.println("Wachten op verbindingen..");
                    Socket sock = sSock.accept();
                    System.out.println("Verbinding gemaakt..");
                    Peer peer = new Peer(sock);
                    new Thread(peer).start();
                    
                    //peer.shutDown();
                }
            }
        } catch (NumberFormatException e)
        {
            System.err.println("Voer een geldige poort in!");
        } catch (IOException e)
        {
            System.err.println("Er is een fout opgetreden: " + e);
        }
    }
}

Code:
public class Venster extends JFrame implements ActionListener
{

    private JCheckBox[] classFiles;
    Peer p;

    public Venster(Peer p)
    {
        this.p = p;
        addWindowListener(new WindowAdapter()
        {

            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });

        classFiles = new JCheckBox[ClassFiles.FILES.length];
        setLayout(new GridLayout(classFiles.length, 1));
        for (int i = 0; i < classFiles.length; i++)
        {
            classFiles[i] = new JCheckBox(ClassFiles.FILES[i]);
            add(classFiles[i]);
            classFiles[i].addActionListener(this);
        }

        setSize(getPreferredSize());
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e)
    {
        String s = "";

        //kijk welk object het vandaan kwam
        for (int i = 0; i < classFiles.length; i++)
        {
            if (e.getSource().equals(classFiles[i]))
            {
                //geef het nummer van de checkbox mee
                s = i + "";

                //geef mee of de checkbox geselecteerd is
                if (classFiles[i].isSelected())
                {
                    s = s + "s";
                } else
                {
                    s = s + "d";
                }
            }
        }
        p.stuur(s + "\n");
    }

    public void process(String s)
    {
        //lees het nummer van de checkbox
        int e = Integer.parseInt(s.substring(0, s.length() - 1));

        //kijk of hij geselecteerd moet worden of niet
        if (s.charAt(s.length() - 1) == 's')
        {
            classFiles[e].setSelected(true);
            classFiles[e].setEnabled(false);
        } else
        {
            classFiles[e].setSelected(false);
            classFiles[e].setEnabled(true);
        }
    }
}

Alvast bedankt! :D
Niek

[edit]Her en der kloppen de pre- en postcondities in de javadoc niet, geen moeite genomen om dit aan te passen :o;)[/edit]
 
Laatst bewerkt:
Leuk zo'n speeltje.. Maar waarom gebruik je niet SVN om je project te delen ?.
Dat is hiervoor geschreven en kan je rechtstreeks vanuit netbeans gebruiken...

En je kan samen aan 1 bestand werken :)

gr.
 
Nou, dat gebruikten we niet omdat we niet wisten dat het bestond :p Ik zal is ff gaan googlen hoe het werkt ;) Bedankt daarvoor! :thumb:

Mocht je me willen uitleggen hoe het moet, graag dan! :p
 
Laatst bewerkt:
In mijn thuisnetwerk werkt het prima. Op een map op mijn ene pc een 'repository' aangemaakt, en vanaf de andere pc met de url file://[interne ipadres]/[repository-map] gaat het prima!

Maar nu het punt dat ik niet altijd met mijn partner op het zelfde netwerk zit.. Dus hij zit thuis en ik zit thuis. Hoe kan ik dit oplossen?
 
Precies hetzelfde, maar dan met je externe ip-adres.
- Als de server achter een router zit dan zal je moeten de poorten forwarden.
- Tenzij je een statisch ip-adres van je provider gekregen hebt zal je ook nog eens telkens je ip-adres moeten doorgeven. Als je je extern ip-adres niet kent, ga gewoon naar www.whatismyipaddress.com
- Het gemakkelijkste in het laatste geval is om een dnsrecord te koppelen aan je ip-adres en dat telkens te laten updaten wanneer je ip-adres wijzigt, dan kan je doen via onder andere dyndns.com.

Als je bovenstaande niet ziet zitten of als dat niet lukt kan je ook een vpn crëeren via Hamachi (google maar), je krijgt allebei een ip-adres in de 5.xxx.xxx.xxx range en voor de rest werkt het als in een intern netwerk. Het vereist enkel dat je allebei Hamachi aan hebt staan en in hetzelfde netwerk gejoined bent.
 
Hey Firebirdy,
bedankt voor je reactie! ;)

Het extern ipadres lijkt mij altijd hetzelfde, maar dat zal verder het probleem niet zijn. Hoe kom ik aan de poorten die ik open moet zetten?
Hamachi ken ik, dit zou ik ook kunnen proberen inderdaad.

wat de url betreft: wordt dit dan (de repository map staat in D:/ut/p2/repository)
file://[ipadres]/d:/ut/p2/repository ? En moet ik nog machtigingen aangeven oid?
 
svn://<your_ip>/<repository_name>
is het formaat. Bijvoorbeeld svn://5.123.123.123/MijnRepository. Extra machtigingen komen er niet aan te pas.

Nog eens voor alle duidelijkheid: als je hamachi gebruikt of als je niet achter een router zit dan heb je die port forwarding niet nodig. Anders moet je op je router poort 3690 (dat is in elk geval de default) TCP forwarden naar de pc waarop de svn server draait. Hoe je dat doet vind je terug in de handleiding van je router.

Ik weet niet wat je nu gebruikt voor svn... mocht je er iets aan hebben, zelf vind'k in windows TortoiseSVN als cliënt en VisualSVN server als server niet slecht.
 
Laatst bewerkt:
Ok dankje!
We zullen dit eens uitproberen ;) Ik had toevallig die poort opengezet, in de hoop dat bij de installatie niks randoms werd gegenereerd. Dit werkte niet, dat zal dus aan de url hebben gelegen. Eerst maar is even de svn:// ... gebruiken, en anders komt het met hamachi wel goed!

Bedankt:thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan