Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

JAVA - simpel client/server applicatie

Pagina: 1
Acties:

  • T.I.M
  • Registratie: Juni 2001
  • Niet online
Ik ben bezig met het maken van een applicatie die zowel server als client is.
Het client gedeelte werkt allemaal goed. Nu ben ik bezig om het server gedeelte te implementeren.

De methode serviceSocket.accept(); is blocking: hij wacht op een client die verbinding wilt maken met deze server en dan gaat hij verder.

Omdat mijn applicatie meer is dan alleen een server loopt mijn applicatie vast. Ik kan niets meer doen in mijn applicatie omdat hij oneindig lang wacht op een client.

Oftewel hoe zorg ik ervoor dat er wel continu geluisterd wordt naar clients maar dat er ook nog processor tijd over is om andere dingen te doen?

code:
1
2
3
 clientSocket = serviceSocket.accept();                                      // Create a socket object from the ServerSocket
            serviceInputStream = new DataInputStream(clientSocket.getInputStream());    // to listen and accept connections
            serviceOutputStream = new DataOutputStream(clientSocket.getOutputStream());



Als ik de code in een thread zet... en ga slapen (bijv. 200ms) dan werkt het programma.
Alleen mis ik clients die in de slaaptijd verbinding willen maken.... Hierdoor mis ik cruciale berichten.

[ Voor 9% gewijzigd door T.I.M op 19-11-2007 16:09 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 11:35

Janoz

Moderator Devschuur®

!litemod

Threads

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Swaptor
  • Registratie: Mei 2003
  • Laatst online: 15-10 19:25

Swaptor

Java Apprentice

Threads zijn jouw vrienden.

Ontdek mij!
Proud NGS member
Stats-mod & forum-dude


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26

TeeDee

CQB 241

Als ik het nu zo schets:
code:
1
2
3
4
- Client gedeelte
- Server Applicatie
      - Server Thread
      - Server Interface (met bijv. een 'Start Server', 'Stop Server' knop)


Edit: blegh... zijn ze me weer voor

[ Voor 12% gewijzigd door TeeDee op 19-11-2007 16:09 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • T.I.M
  • Registratie: Juni 2001
  • Niet online
Als ik de code in een thread zet... en ga slapen (bijv. 200ms) dan werkt het programma.
Alleen mis ik clients die in de slaaptijd verbinding willen maken.... Hierdoor mis ik cruciale berichten.

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:20

voodooless

Sound is no voodoo!

Niet alleen voor de accept() zul je een thread moeten maken, maar doorgaans ook voor iedere client.

Het kan trouwens ook gewoon zonder, maar dan moet je gebruik maken van non-blocking io, dat kan handig met bijvoorbeeld een lib als xscocket.

Do diamonds shine on the dark side of the moon :?


  • T.I.M
  • Registratie: Juni 2001
  • Niet online
voodooless schreef op maandag 19 november 2007 @ 16:09:
Niet alleen voor de accept() zul je een thread moeten maken, maar doorgaans ook voor iedere client.

Het kan trouwens ook gewoon zonder, maar dan moet je gebruik maken van non-blocking io, dat kan handig met bijvoorbeeld een lib als xscocket.
Er maakt maar 1 client per tijdseenheid verbinding met de server. De server die ik maak hoeft dus maar 1 client tegelijk af te kunnen handelen.

  • qless
  • Registratie: Maart 2000
  • Laatst online: 12:33

qless

...vraag maar...

Server klasse (extends Thread)
code:
1
2
3
4
5
6
7
8
9
10
    public void run() {
        run = true;
        while (run) {
            try {
                new ServerThread(serverSocket.accept()).start();
                Thread.sleep(sleep);
            } catch (Exception e) {
            }
        }
    } //run


ServerThread is dan per client de Thread die het werkt doet.

Website|Air 3s|Mini 4 Pro|Avata 2|Canon R6|Canon 5d2|8 fisheye|14f2.8|24f2.8|50f1.8|135f2|10-22|17-40|24-105|70-300|150-600


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26

TeeDee

CQB 241

Dat maakt dan toch niet uit?
Of je voor 1 client nu een nieuwe thread maakt of voor 200 clients. Die nieuwe thread zal je over het algemeen moeten maken.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:20

voodooless

Sound is no voodoo!

T.I.M schreef op maandag 19 november 2007 @ 16:09:
Als ik de code in een thread zet... en ga slapen (bijv. 200ms) dan werkt het programma.
Alleen mis ik clients die in de slaaptijd verbinding willen maken.... Hierdoor mis ik cruciale berichten.
Waarom werkt 't alleen als je slaapt :? En waarom zou je willen slapen :?

Do diamonds shine on the dark side of the moon :?


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

qless schreef op maandag 19 november 2007 @ 16:18:
Server klasse (extends Thread)
code:
1
2
3
4
5
6
7
8
9
10
    public void run() {
        run = true;
        while (run) {
            try {
                new ServerThread(serverSocket.accept()).start();
                Thread.sleep(sleep);
            } catch (Exception e) {
            }
        }
    } //run


ServerThread is dan per client de Thread die het werkt doet.
Zou je de declaratie van die run boolean eens kunnen laten zien?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 06:38

Gerco

Professional Newbie

T.I.M schreef op maandag 19 november 2007 @ 16:09:
Als ik de code in een thread zet... en ga slapen (bijv. 200ms) dan werkt het programma.
Alleen mis ik clients die in de slaaptijd verbinding willen maken....
Aangezien accept() blocking is, hoef je helemaal niet te slapen. Als dat weglaat, zal het ws prima werken.

[ Voor 4% gewijzigd door Gerco op 20-11-2007 08:57 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

T.I.M schreef op maandag 19 november 2007 @ 16:09:
[...]


Als ik de code in een thread zet... en ga slapen (bijv. 200ms) dan werkt het programma.
Alleen mis ik clients die in de slaaptijd verbinding willen maken.... Hierdoor mis ik cruciale berichten.
Je moet in je tweede thread ook niet slapen maar die blocking call aanroepen.

All my posts are provided as-is. They come with NO WARRANTY at all.


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

T.I.M schreef op maandag 19 november 2007 @ 16:12:
Er maakt maar 1 client per tijdseenheid verbinding met de server. De server die ik maak hoeft dus maar 1 client tegelijk af te kunnen handelen.
Dat is misschien nu zo, maar blijft dat altijd zo? Ik zou de verbinding door een aparte thread laten afhandelen als ik jou was, dan ben je voorbereid op de toekomst. Met bijvoorbeeld een ThreadPoolExecutor is dat ook een fluitje van een cent. Dan begin je met een Executors.singleThreadPoolExecutor (of hoe dat ding ook exact mag heten; ben te lui om het op te zoeken) en kan je die altijd vervangen door eentje met meerdere threads.

Wie trösten wir uns, die Mörder aller Mörder?


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:20

voodooless

Sound is no voodoo!

Iets zegt me dat de Thread is gestart met run() i.p.v start() ...

Do diamonds shine on the dark side of the moon :?


  • T.I.M
  • Registratie: Juni 2001
  • Niet online
Bedankt voor alle reacties.

Ik dacht dat ik in een thread moest gaan slapen (als de thread niets meer te doen heeft) om zo andere threads de ruimte te geven om ook processertijd te kunnen krijgen.
Blijkbaar is dit in JAVA onderwater al goed geregeld.

Nu heb ik de server kant van de applicatie in een aparte thread gezet. En werkt de applicatie.
en in de run functie ga ik luisteren naar clients.
code:
1
2
3
4
5
6
7
public class Service implements Runnable {

public void run () { // code die uitgevoerd wordt als de thread gestart is....... }

public void main() {
(new Thread(new Service())).start();
}


Nu nog even mijn applicatie uitbreiden zodat ik data verkregen in deze thread kan communiceren naar de rest van het programma... in iedergeval allemaal erg bedankt :)
Pagina: 1