Avatar billede adagio Nybegynder
22. november 2003 - 14:04 Der er 24 kommentarer og
1 løsning

Chat med Gui problem (Kører over Socket)

I mit chat program jeg har, kører der en Server, som har en Thread per client. Disse Threads modtager beskeder fra andre brugere, og sender beskeden videre til alle klienter som er forbundet til serveren (De nødvendige informationer er protected på serveren, så den kan sagtens få fat i forbindelsen til dem)

På klient siden kører der en Thread som modtager disse beskeder, og som så skriver dem ind på klientens skærm.

Når jeg kører programmet uden Gui, så kan jeg godt få det til at virke (lokalt... har ikke prøvet over nettet endnu). Dertil bruger jeg denne kode i run metoden i Thread:

System.out.println(c.inStream.readLine());

(c er en instans a Client.class)

Hvis jeg så til gengæld prøver at bruge en Gui istedet, så virker det ikke mere. Jeg har prøvet at bruge denne kode i run() metoden i stedet:

gc.txtChatLog.setText(gc.txtChatLog.getText() + "\n" + gc.inStream.readLine());

(gc er en instans a GuiClient.class)
txtChatLog er sat til protected (Har også prøvet med public)

Men når jeg så kører den, så sender den kun beskeden til serveren (Som modtager beskeden og skriver beskeden på Server's skærm billede (Som kun er et dos-vindue på nuværende tidspunkt), hvorimod der sker ikke nogen ændringer i textarea i Gui'en



Og hvorfor er det lige at det kører vildt langsomt?
Er det fordi jeg prøvet at køre både Client og Server på samme maskine?
Jeg har en 2.4 GHz, og når jeg kører begge ting, så bruger den 100% af min processor kraft...
Avatar billede soreno Praktikant
22. november 2003 - 14:08 #1
Kunne du ikke poste hele Gui klassens run metode ?
Avatar billede adagio Nybegynder
22. november 2003 - 14:23 #2
Du mener det som bliver udført når der trykkes på "Send" knappen? Gui klassen har ingen run metode


ChatRead cr = new ChatRead(c);
cr.start();
       
if(!isConnected)
{
    isConnected = true;
    buf = new BufferedReader(new InputStreamReader(System.in));

    outStream.println("ADG"); // Temp navngivning (Første string der sendes er nick)
}

String msg = txtSendMsg.getText();
gc.outStream.println(msg);
Avatar billede adagio Nybegynder
22. november 2003 - 14:25 #3
I GuiChat constructor køres denne kode:

try
{
    // Opretter forbindelse, til valgte IP adresse og portnr.
           
    soc = new Socket("127.0.0.1", 2002);
    System.out.println("Forbindelse til Server er oprettet");
           
    // Så der er en forbindelse til både indkomne og udgående beskeder
   
    inStream = new DataInputStream(soc.getInputStream());
    outStream = new PrintStream(soc.getOutputStream());   
}
catch(Exception e)
{

}
Avatar billede dsj Nybegynder
22. november 2003 - 14:32 #4
Jeg tror du er løbet ind i et tråd-problem. En tråd begynder at loope et eller andet sted og derfor får du aldrig noget frem på klientens skærm. Denne antagelse understøttes også af det faktum, at din CPU belastes med 100 %, hvilket er et normalt tegn på at en trød looper, altså kosntant kører i ring uden at udføre et egentligt arbejde.
Avatar billede adagio Nybegynder
22. november 2003 - 14:57 #5
Tja, den eneste tråd jeg har ændret i fra at det kører i dos-vindue til gui er ChatRead tråden, hvor jeg udskiftede denne linje:

System.out.println(c.inStream.readLine());

Med denne:
Avatar billede adagio Nybegynder
22. november 2003 - 14:57 #6
gc.txtChatLog.setText(gc.txtChatLog.getText() + "\n" + gc.inStream.readLine());
Avatar billede dsj Nybegynder
22. november 2003 - 15:20 #7
Skal der ikke stå:

gc.txtChatLog.setText(gc.txtChatLog.getText() + "\n" + c.inStream.readLine());

Altså 'c.inStream' i stedet for 'gc.inStream' ??
Avatar billede dsj Nybegynder
22. november 2003 - 15:22 #8
Næh, kan jeg godt se. Det kunne være rart at se Client's konstruktør...
Avatar billede conrad Nybegynder
22. november 2003 - 16:25 #9
ved ikke om det kan have noget at sige, men DataInputStream.readLine() er deprecated:

http://java.sun.com/j2se/1.4.2/docs/api/java/io/DataInputStream.html#readLine()

Har du prøvet lige at teste med
Strint test = c.inStream.readLine();
System.out.println(test);
gc.txtChatLog.setText(gc.txtChatLog.getText() + "\n" + test);
Avatar billede adagio Nybegynder
22. november 2003 - 17:08 #10
DSJ >>

Client bliver ikke brugt til noget ved Gui, eftersom at den indeholder det samme som GuiChat (Constructor er nøjagtigt det samme)

Conrad >>

Det har jeg prøvet. Det gør ingen forskel. Og readLine() virker jo fint nok når jeg kører uden gui...
Avatar billede adagio Nybegynder
22. november 2003 - 17:35 #11
Hele source koden til mit program kan findes her:
http://zcollection.sytes.net/files/Java/Socket.zip
Avatar billede soreno Praktikant
22. november 2003 - 17:43 #12
Prøv at rette din run i "ChatRead.java" til noget ala:

    public void run()
    {
        while(true) // Uendelig løkke, så den kan blive ved med at sende beskeder tilbage
        {
            try
            {
                gc.txtChatLog.setText(gc.txtChatLog.getText() + "\nOh No");
                gc.txtChatLog.setText(gc.txtChatLog.getText() + "\n" + gc.inStream.readLine());
                Thread.sleep(1000);           
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }
Avatar billede adagio Nybegynder
22. november 2003 - 17:50 #13
Ehmmm... kan ikke lige se hvor forskellen ligger!?!
Avatar billede adagio Nybegynder
22. november 2003 - 17:52 #14
Ahh... e.printStackTrace()

Den skriver noget om en NullPointerException
Avatar billede soreno Praktikant
22. november 2003 - 17:56 #15
Dvs. der er problemer med at:
gc.txtChatLog

ikke peger på noget sigende.

Men jeg har kigget lidt i din kode og jeg har ikke kunnet finde fejlen. Faktisk har jeg lidt svært ved at finde rundt i koden.
Avatar billede adagio Nybegynder
22. november 2003 - 18:02 #16
Btw, ovenstående sleep(1000) metode blev kun brugt som en lille test en overgang...
Avatar billede soreno Praktikant
22. november 2003 - 18:04 #17
Ja, men den er ret vigtig.

Ellers når txtChatLog ikke at opdatere indholdet.
Den er jo inde i en uendelig løkke.

Jeg tror at en god gang refactoring af koden (og logikken) vil gøre programmet nemmere at debugge.
Avatar billede adagio Nybegynder
22. november 2003 - 18:10 #18
Tja, jeg skulle have brugt hele denne uge på at få gjort koden til at være lettere at læse, men jeg har lagt syg hele ugen, så jeg har ikke kunnet kigge på det før nu...
Skal bruge det til skole på mandag
Avatar billede conrad Nybegynder
22. november 2003 - 20:30 #19
Jeg har kigget lidt på din kode, og jeg tror du forholdsvis nemt kan "redde" så den virker for din GuiChat.

1) slet private static GuiChat gc;
   
    og fjern static her
    static Socket soc;
    static BufferedReader buf;
    static DataInputStream inStream;
    static PrintStream outStream;
Avatar billede conrad Nybegynder
22. november 2003 - 20:33 #20
2) drop linien gc = chat; i din GuiChat main()
3) void cmdSendMsg_actionPerformed(ActionEvent e)
    {
       
        ChatRead cr = new ChatRead(c);.....
rettes til ChatRead cr = new ChatRead(this);
Avatar billede conrad Nybegynder
22. november 2003 - 20:35 #21
4) I din ChatRead skal du tilføje konstruktoren
ChatRead( GuiChat gc)
    {
        this.gc = gc;
    }
(dette kan med fordel gøres som punkt 1 !
Avatar billede conrad Nybegynder
22. november 2003 - 20:40 #22
og så glemte jeg lige at du skal ændre
String msg = txtSendMsg.getText();
gc.outStream.println(msg); -> outStream.println(msg);
Avatar billede adagio Nybegynder
22. november 2003 - 22:04 #23
Takker, nu opdatere den txtChatLog, dog ser det ikke ud til at virke helt endnu, kan dog ikke lige ummidelbart se hvor problemet skal ligge.
Efter kort tid lader den være med at opdatere skærmen. Beskederne bliver rigtigt nok sendt (De bliver udskrevet på Server skærmen)
Jeg prøve at lave en e.printStackTrace ved alle Try/Catch, men der bliver ikke skrevet nogen fejlmeddelelse ud...
Men det må jeg vel kigge nærmere på i morgen, arbejder ikke mere med det i aften
Avatar billede conrad Nybegynder
23. november 2003 - 09:24 #24
Det er nok fordi du laver en ny tråd (ChatRead) hver gang du trykker på send og aldrig lukker nogle af dem. Du behøver sådan set kun en tråd som lytter efter beskeder
Avatar billede adagio Nybegynder
23. november 2003 - 12:20 #25
Ah, ups... der lå fejlen...

Takker for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester