[Java] Thread probleem*

Pagina: 1
Acties:

  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
Ik heb in Java een chat programma geprogrammeerd. Het werkt helaas maar half ik kan alleen maar berichten verzenden en niet ontvangen.

Wat is mijn probleem namelijk:
Ik maak een threath aan die steeds een stream leegt om te kijken op nieuwe berichten, althans was mijn idee is dit een goed idee????. Maar de threath die ik aanmaak wil helaas pas draaien als de socket geen verbinding meer heeft met het andere programma.
Ik vind dit erg vaag, ik gebruik geen threath.stop resume of andere methoden van de thread die vaak voor fouten zorgen hier heb ik delen van mijn code. Hieronder staat mijn code

Java:
1
2
3
4
5
6
7
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;

public class ChatWin extends Frame implements ActionListener, Runnable {

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public void run()
    {
        Thread myThread = Thread.currentThread();
//th == myThread dit had ik eerst in while staan maar daar ligt he took niet aan
        while (true)
            {
                try
                {
                    JOptionPane.showMessageDialog(null, br.readLine());
                    txtChat.setText(br.readLine());
                }catch (Exception h){
                    JOptionPane.showMessageDialog(null, h.getMessage());
                }
            }
    }

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//code die de socket opent en een threath start
    public void openChatSession()
    {
        // Openen van chat sessie
        try {
            chatSocket = new Socket(txtRemoteIp.getText(), Integer.parseInt(txtRemotePort.getText()));
            br = new BufferedReader(new InputStreamReader(chatSocket.getInputStream()));
            bw = new BufferedWriter(new OutputStreamWriter(chatSocket.getOutputStream()));
            th = new Thread(this);
            th.start();
        } catch(Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
    }


Waar kan mijn probleem aan liggen, ik ben nog redelijk nieuw in het java wereldje duzzz kan best zijn dat ik wat vergeet bij het maken van een threath. Alles zit wel bij mij in een class niet echt netjes maarja.

Nog even een andere vraag hoe kan ik nu het best een threath stoppen?
Zoeiets:
Java:
1
2
3
4
threathNaam = null;
//of toch
threathNaam.stop(); 
// Volgens meerdere boeken en websites is de laatste een slechte methode kan namelijk fouten veroorzaken. Maar kan ik dan het best de bovenste nemen???


Alvast bedankt! _/-\o_

W3designer.nl


  • DaRKie
  • Registratie: December 2001
  • Laatst online: 27-05 11:12
[off-topic]
het is dus threaD :)
[/off-topic]

enne, wat voor chat programma maak je? met een zelf gemaakte server? if yes, plaats dan code van server er ook bij

[ Voor 57% gewijzigd door DaRKie op 15-05-2003 16:27 ]


Verwijderd

Thread stoppen doe je NIET met .stop(),
maar door de true in de while(true) te vervangen door een boolean. Deze boolean kun je mbv een methode dan weer false maken. Thread.stop() is zelfs deprecated.

zie ook:
http://java.sun.com/produ...PrimitiveDeprecation.html

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

En als je een boolean gebruikt is het verstandig deze als volatile te definieren.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
DaRKie schreef op 15 May 2003 @ 16:23:
[off-topic]
het is dus threaD :)
[/off-topic]

enne, wat voor chat programma maak je? met een zelf gemaakte server? if yes, plaats dan code van server er ook bij
Haha oké thread, maja ik zend gewoon een tcp pakket weg met een string naar het andere programmatje. Maar dat maakt niet echt uit want hij wil de thread gewoon niet uitvoeren. als hij de thread uitvoert heb ik het programma werkend. Als de socket gesloten wordt aan de andere kant wil hij opeens alles in een messagebox weer geven(ik had een keer een messagebox in de thread zitten volgens mij zit hij niet in mijn voorbeeld code).

Wie weet wat doe ik fout met mijn thread???
.oisyn schreef op 15 May 2003 @ 16:43:
En als je een boolean gebruikt is het verstandig deze als volatile te definieren.
Oké kan ik dus gewoon in de while loop de de boolean veranderen is dan nog of zo nog nodig???
Java:
1
threadNaam = null;

[ Voor 18% gewijzigd door DarkSilence op 15-05-2003 17:39 ]

W3designer.nl


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

gewoon boolean op null, en dan stopt de thread vanzelf (vooropgesteld dat ie op een gegeven moment weer in de evaluatie van de while-lus terecht komt ;))

Met Thread.interrupt () kun je overigens een exceptie laten genereren in die thread. Dan kun je bijvoorbeeld eerst de boolean omzetten, dan een aantal seconden wachten tot de thread gestopt is, en als de thread dan nog niet gestopt is een interrupt () doen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
.oisyn schreef op 15 May 2003 @ 18:02:
gewoon boolean op null, en dan stopt de thread vanzelf (vooropgesteld dat ie op een gegeven moment weer in de evaluatie van de while-lus terecht komt ;))

Met Thread.interrupt () kun je overigens een exceptie laten genereren in die thread. Dan kun je bijvoorbeeld eerst de boolean omzetten, dan een aantal seconden wachten tot de thread gestopt is, en als de thread dan nog niet gestopt is een interrupt () doen
Oké ik weet nu hoe ik een thread moet stoppen op een goede manier. Maar ik wil eerst ff mijn thread aan de praat krijgen anders heb je er zo weinig aan. ;)

Zo vreemd mijn thread werkt wanneer de socket gesloten wordt daarvoor niet. :'( Heeft iemand een idee wat er fout aan mijn code is. als nodig is wil ik ook wel de hele code posten. Alvast bedankt

W3designer.nl


  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:04

momania

iPhone 30! Bam!

Waar is je ServerSocket?
Ik meen me te herinneren dat je die moet aanmaken en dat die op z'n eerste input die die krijgt via de accept() methode een instantie van een Socket terug geeft. Daar kan je dan de input uitlezen.

Neem je whisky mee, is het te weinig... *zucht*


  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
momania schreef op 15 May 2003 @ 19:37:
Waar is je ServerSocket?
Ik meen me te herinneren dat je die moet aanmaken en dat die op z'n eerste input die die krijgt via de accept() methode een instantie van een Socket terug geeft. Daar kan je dan de input uitlezen.
De connectie bouwt hij echt wel goed op! Het enige probleem is dat de thread niet wordt uitgevoerd. Het is namelijk zo de thread wordt een keer als de verbinding gelegd is uitgevoerd tot de connectie wordt verbroken doet de thread helemaal niets.
Als de verbinding gesloten is dan gaat de thread weer werken en dan doet hij netjes zijn werk ik zie dan alle berichten die verzonden zijn door de andere kant aan een gekoppeld in een stream zitten.

Dus het ligt aan de thread die niet wil draaien het programma doet voor de rest alles wat hij moet. en dat vind ik zo vreemd vandaar dat ik hem post.

Misschien waar ik aan zit te denken is dat java of in ieder geval hoe ik de thread heb aangemaakt maar één thread aan kan en de socket zich ook gedraagd als thread.
Waarom hangt de socket in verband met de thread en kunnen ze niet beide hun werk doen.

Plzzzz help ik ben ten einde raad. Heeft iemand een idee wat het probleem is????
Of hoe ik de thread misschien anders kan aanmaken. Heel graag alvast bedankt

[ Voor 1% gewijzigd door DarkSilence op 15-05-2003 22:19 . Reden: Ik schreef thread weer eens fout :) ]

W3designer.nl


Verwijderd

En zo dan?
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.io.*; 
import java.net.*; 

public class ChatWin extends Frame implements ActionListener, Runnable 
{
    private Thread t;

    public void start()
    {
         t = new Thread(this);
         t.start();
    }

    public void run()
    {
         //hier de afhandeling van de streams enzo
    }

  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:04

momania

iPhone 30! Bam!

Misschien zit 't em hier in:
Java:
1
2
3
4
5
6
try {
   JOptionPane.showMessageDialog(null, br.readLine()); 
   txtChat.setText(br.readLine()); 
}catch (Exception h){ 
   JOptionPane.showMessageDialog(null, h.getMessage()); 
} 

De doet hier 2 keer een readLine() achter elkaar, terwijl je hier volgens mij eigenlijk in de MessageDialog en TextArea het zelfde wil hebben.
Je kan dan beter het resultaat van readLine() overnemen in een String en die gebruiken om de andere 2 objecten te vullen
zoiets dus:
Java:
1
2
3
4
5
6
7
try {
   String readResult = br.readLine();
   JOptionPane.showMessageDialog(null, readResult); 
   txtChat.setText(readResult); 
}catch (Exception h){ 
   JOptionPane.showMessageDialog(null, h.getMessage()); 
} 


En doe je ook wel een flush() aan de andere kant met je BufferedWriter ?

Neem je whisky mee, is het te weinig... *zucht*


  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
Verwijderd schreef op 15 May 2003 @ 23:05:
En zo dan?
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.io.*; 
import java.net.*; 

public class ChatWin extends Frame implements ActionListener, Runnable 
{
    private Thread t;

    public void start()
    {
         t = new Thread(this);
         t.start();
    }

    public void run()
    {
         //hier de afhandeling van de streams enzo
    }
Bedankt voor de post, getest maar helaas werkt dit ook niet. :'( Die socket vreet gewoon de thread op. Hoe kan dat???

W3designer.nl


  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:04

momania

iPhone 30! Bam!

DarkSilence schreef op 15 May 2003 @ 23:25:
Bedankt voor de post, getest maar helaas werkt dit ook niet. :'( Die socket vreet gewoon de thread op. Hoe kan dat???
Krijg je wel die MessageDialog te zien met een resultaat van die readLine() ?

Neem je whisky mee, is het te weinig... *zucht*


  • reskobon
  • Registratie: November 2001
  • Laatst online: 27-05 12:58
Wat ik zowiezo niet zou doen is een thread draaien in een Frame maar goed dat meot je zelf weten. Maak een aparte klasse aan en laat die de Thread klasse overerven. Je maakt je readers en writers aan en idd zoals in je bovenste code ze tje in de run() methode de readline(). Hij blijft hier dan netjes hangen totdat er een bericht binnenkomt.

Jij maakt nu dus gebruik van de Runnable interface maar ik zou gewoon de Thread klasse pakken :)

[ Voor 13% gewijzigd door reskobon op 15-05-2003 23:36 ]

Leeg


Verwijderd

En zoiets dan?
Java:
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
public class Blah extends whatever implements wat_listeners
{
   public void connect() throws IOException
  {
      socket = new Socket(getCodeBase().getHost(), 30000);
      streamIn = new DataInputStream(socket.getInputStream());
      streamOut = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
   }        

   public void sendToServer(String s) throws IOException 
   {
        if(streamOut != null) 
        {
            streamOut.writeUTF(s);
            streamOut.flush();
        }
   }

   public void start()
   {
       t = new Thread(this);
       t.start();
   }
   
    public void run()
    {
         try
         {
                connect(); 
                
                while(isConnected)
               {
                      String text = streamIn.readUTF();
                      //etc
               }
         }
         catch(IOException e)  { //blah }
    }
}

  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
reskobon schreef op 15 May 2003 @ 23:35:
Wat ik zowiezo niet zou doen is een thread draaien in een Frame maar goed dat meot je zelf weten. Maak een aparte klasse aan en laat die de Thread klasse overerven. Je maakt je readers en writers aan en idd zoals in je bovenste code ze tje in de run() methode de readline(). Hij blijft hier dan netjes hangen totdat er een bericht binnenkomt.

Jij maakt nu dus gebruik van de Runnable interface maar ik zou gewoon de Thread klasse pakken :)
Ik kan dat wel eens ff proberen een andere class maken met de thread. Ik ken alleen maar de theorie van overerfen en nog niet echt de praktijk. moet ik ff wat gaan proberen.
momania schreef op 15 May 2003 @ 23:31:
[...]

Krijg je wel die MessageDialog te zien met een resultaat van die readLine() ?
Nee ook niet dus die thread wordt niet goed uitgevoerd

W3designer.nl


  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:04

momania

iPhone 30! Bam!

DarkSilence schreef op 16 mei 2003 @ 19:00:
[...]
[...]
Nee ook niet dus die thread wordt niet goed uitgevoerd
Dat betekend dan waarschijnlijk dat ie toch op die readLine() blijft hangen.

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

gooi gewoon overal in je code een System.out.println("Debug: <getal>");

en kijk wat ie overslaat als de socket nog openstaat, misschien heb je er wat aan

Verwijderd

Is het niet mogelijk dat het probleem bij de andere kant ligt?
Dat zou een verklaring kunnen zijn. Als hij bezig blijft met pogingen om een connectie tot stand te brengen met de server.

In het server progje zou zoiets moeten staan van
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public ChatServer {
  ServerSocket server = new ServerSocket(3300);
  
  listening = true;

  connector = new Thread(this) ;
  connector.start();
}

public void run() {
  while(listening) {
    Socket newClient = server.accept();
    
    // Doe vervolgens wat je met de nieuwe socket wil doen
  }
}


Ook moet je oppassen met de manier waarop je op dit moment de InputStream uitleest.
Je kunt denk ik beter het zo doen:
Java:
1
2
3
4
5
6
 
  String lineIn = "";

  while ((lineIn = in.readLine()) != null) {
     //Doe iets met de lineIn;
  }


Ik hoop dat je hier iets aan hebt..

  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
Verwijderd schreef op 16 May 2003 @ 22:48:
Is het niet mogelijk dat het probleem bij de andere kant ligt?
Dat zou een verklaring kunnen zijn. Als hij bezig blijft met pogingen om een connectie tot stand te brengen met de server.

In het server progje zou zoiets moeten staan van
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public ChatServer {
  ServerSocket server = new ServerSocket(3300);
  
  listening = true;

  connector = new Thread(this) ;
  connector.start();
}

public void run() {
  while(listening) {
    Socket newClient = server.accept();
    
    // Doe vervolgens wat je met de nieuwe socket wil doen
  }
}
[..]

Ik hoop dat je hier iets aan hebt..
Ja zoeits als de bovenstaande code heb ik ook. Maar ik heb wel een host code in mijn chat programma zitten. Maar ik test mijn chat programma met een visual basic programma wat ik ff een keer lang geleden snel heb geprogrammeerd met het winsock control.
Ik heb zonet ff een account aangemaakt bij tripod om ff op internet de code te plaatsen + visual basic programma waar ik verbinding mee maak.
Maar de ftp van tripod is nu down :S Mijn visual basic programma is niet ed boos doender die heb ik al zeer goed getest dus dat werkt altijd wel. Maar het ligt bij mij java proggie echt aan de thread. Ik ben van plan om een apparte class te maken voor de thread maar weet niet echt goed hoe.

Heeft iemand daarvan een makkelijk voorbeeld van zodat ik kan testen of het dan werkt? Alvast bedankt

Uhm... ik geef zo de url wel van de website als ik iets kan uploaden.

W3designer.nl


  • reskobon
  • Registratie: November 2001
  • Laatst online: 27-05 12:58
Ok ik heb even de meest eenvoudige thread voor het afvangen van berichten getikt, deze werkt bij mij prima.

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

public class Checkincomming extends Thread {
  //declaraties
  private Socket sck;
  private BufferedReader in;

  //////////////////////////////////////////////////////////////////////////////
  //constructor Checkincomming
  //////////////////////////////////////////////////////////////////////////////
  public Checkincomming(){
    try {
      this.in = new BufferedReader(new InputStreamReader(sck.getInputStream()));
    }
    catch (Exception e) {
      System.out.println(e.getMessage());
    }
  }

  //////////////////////////////////////////////////////////////////////////////
  //run() methode die standaard in een Thread zit
  //deze luistert naar de server en zodra er wat binnenkomt,
  //stuurt hij dat door naar de functie controleren
  //////////////////////////////////////////////////////////////////////////////
  public void run(){
    while(true){
      try{
        //hier blijft hij wachten totdat er wat binnenkomt
        String str = in.readLine();
        if(str == null) {
          //bericht is leeg
          break;
        }
        else{
          //bericht wordt afgedrukt
          System.out.println(str);
        }
      }
      catch(IOException e){
        System.out.println("Connection closed by server");
      }
    }
  }
}


Succes ermee!

[ Voor 7% gewijzigd door reskobon op 18-05-2003 09:17 ]

Leeg


  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
Ik heb nu ff wat bestanden op internet gezet, url:
http://members.lycos.nl/darksilence101/ (hier staan linkjes naar de source codes en vb proggie)

Ik krijg dank zij de bovenstaande code de thread wel aan de praat maar dan moet hij niks doen met mijn bufferstream want ik kan de bufferstream uit de andere class niet goed opvragen. De source code:
http://members.lycos.nl/darksilence101/ChatProgram.java

Je kan het testen met mijn programma in vb: http://members.lycos.nl/darksilence101/Winsockmesenger.exe

Kan iemand mij vertellen wat ik nu nog fout doe in mijn java proggie dat ik niet uit de andere class de bufferstreamreader kan opvragen?

Alvast bedankt

W3designer.nl


  • reskobon
  • Registratie: November 2001
  • Laatst online: 27-05 12:58
Je hebt een object van ChatProgram daaruit maak jij een object van CheckIncoming. Daarin maak jij een nieuw object van ChatProgram maar dit is een ander object dan het eerste dus eventuele variabelen of objecten daaruit kent hij niet, evenals je BufferedReader :)

Kijk er maar eens naar de oplossing kan ik wel geven maar dit moet je even doorzien :)

Leeg


  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
reskobon schreef op 18 May 2003 @ 19:20:
Je hebt een object van ChatProgram daaruit maak jij een object van CheckIncoming. Daarin maak jij een nieuw object van ChatProgram maar dit is een ander object dan het eerste dus eventuele variabelen of objecten daaruit kent hij niet, evenals je BufferedReader :)

Kijk er maar eens naar de oplossing kan ik wel geven maar dit moet je even doorzien :)
Moet ik bij het starten van thread dit mee geven:
Java:
1
2
3
4
5
6
7
8
// Aanroepen van de procedure threadstart
checkin.startTh(checkin.startTh);

// In de class thread
public void startTh(ChatProgram chatprog)
{
  // Thread start code
}


Maar hoe weet dan mijn Thread zelf wat chatprog is? Want in run kan ik wel niet dit doen:
Java:
1
2
3
4
5
// De run code hoe maoet dat dan?
public void run(ChatProgram chatprog)
{
  //run code
}


Misschien toch een voorbeeld kan ik snel achterhalen of het wel werkt in een aparte class! Alvast bedankt!!!

W3designer.nl


  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:04

momania

iPhone 30! Bam!

DarkSilence schreef op 19 mei 2003 @ 16:30:
[...]


Moet ik bij het starten van thread dit mee geven:
Java:
1
2
3
4
5
6
7
8
// Aanroepen van de procedure threadstart
checkin.startTh(checkin.startTh);

// In de class thread
public void startTh(ChatProgram chatprog)
{
  // Thread start code
}


Maar hoe weet dan mijn Thread zelf wat chatprog is? Want in run kan ik wel niet dit doen:
Je moet je Thread toch eerst initialiseren?
Dat doe je met die startTH (bla bla) toch?

Wat dacht je d'r van als je dan een variabele van ChatProgram maakt in je Thread en die laat vullen door de waarde die je in je startTh methode mee krijgt?
zo dus:
Java:
1
2
3
4
5
6
7
8
// In de class thread
ChatProgram mainChat

public void startTh(ChatProgram chatprog)
{
  mainChat = chatprog;
  // Thread start code
}


Dan heb je dus in je Thread een referentie naar je ChatProgram en die kan je dan in je run() methode ook benaderen.

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Zet in je openChatSession() methode even een System.out voor het aanmaken van de socket en eentje er vlak daarna en kijk even welke wordt (worden) afgedrukt.
Java:
1
2
3
4
5
6
7
8
9
    public void openChatSession() 
    { 
        // Openen van chat sessie 
        try {
            System.out.println("Voor het openen van de connectie");
            chatSocket = new Socket(txtRemoteIp.getText(), Integer.parseInt txtRemotePort.getText()));
            System.out.println("Connectie met server geopend");
         
            ........


Btw. Het is denk ik beter (meer O.O.) als je die 'ChatProgram' variabele in de constructor meegeeft i.p.v. in een losse methode.
Ook zal op dit moment de code in de constructor van het 'Ceckincoming' (wat trouwens eigelijk 'CheckIncoming' moet zijn) een nullpointer gooien omdat er een Socket object (sck) wordt gebruikt die nog niet is aangemaakt.

[ Voor 27% gewijzigd door Verwijderd op 19-05-2003 18:42 . Reden: Nog iets vergeten :) ]


  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
Ik heb nu de thread in een aparte class. Maar nu wil die nog steeds niet de thread samen met de socket draaien. Eerst de socket weer dicht en dan gaat de thread draaien. Waarom doet hij dat en wat kan ik er tegen doen?

W3designer.nl

Pagina: 1