[Java] server socket probleempje

Pagina: 1
Acties:

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 17:04
Ik ben bezig aan een eenvoudige irc server/client toepassing in java. Voor 1 gebruiker kan ik vrij eenvoudig een servertje opzetten en communiceren, maar aangezien mijn project op een variabel aantal gebruikers moet lopen stelt dit dus niets voor :)

Nu vroeg ik mij echter af hoe ik mijn server een bepaalde output/input stream laat koppelen aan een bepaalde gebruiker (dit is volgens mij een juiste methode om verschillende clients naar elkaar eenvoudige string boodschappen te laten sturen)?

dit stukje code heb ik al voor het afhandelen van 2 gebruikers (maar ik denk volledig fout aangezien de 2e in/output stream nooit zal benut worden):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
try {
     ds = new ServerSocket(9999,2);
      s = ds.accept();
     in = new InputStreamReader(s.getInputStream());
    input = new BufferedReader(in);
   output = new PrintStream(s.getOutputStream());
 
     s2 = ds.accept();   
    in2 = new InputStreamReader(s2.getInputStream());
   input2 = new BufferedReader(in2);
  output2 = new PrintStream(s2.getOutputStream());
    
    } catch (Exception f) { System.out.println("error"); }

de verdere afhandeling van het probleem is niet echt het probleem aangezien elke client toch dezelfde methoden moet gebruiken om een string te ontvangen/zenden van/naar de server.

Clowns to the left of me, Jokers to the right


  • Glock
  • Registratie: November 2001
  • Niet online
zou je je code in [ code ] tags kunnen neerzetten, dat leest wat prettiger.
verders, begroeting en afsluitingen als thx en je naam onder posts plaatsen is nutteloos.

(iom D2k)

Edit: [topic=309815]

  • nxt
  • Registratie: November 2001
  • Laatst online: 26-08 13:51

nxt

zoiets?
code:
1
2
3
4
5
6
7
8
EenClassDieDeRestDoet tmp;
public void run() {
  while (isRunning)  {
     Socket s = ds.accept();
     tmp=new EenClassDieDeRestDoet(s)
     tmp.start();
  }
}

edit: en om ze te laten communiceren,
hoef je ze alleen maar een msg naar de outputstream laten zenden, en dan zou die bij alle instanties van in dit geval 'EenClassDieDeRestDoet' bij de inputstream weer binnen moeten komen

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 17:04
ja dat zou goed kunnen aansluiten bij iets dat ik zonet gelezen heb...
op comp.lang.java.programmer stelde men mij
voor om elke socket accept op te slaan in een vector en dan bij binnenkomende communicatie gewoon de doel index opzoeken en dan een output stream genereren voor deze index

vraag mij wel af of ik alleen de socket zou opslaan of ook de input en output streams voor elke client...

Clowns to the left of me, Jokers to the right


  • nxt
  • Registratie: November 2001
  • Laatst online: 26-08 13:51

nxt

alleen de socket is genoeg

  • TheOneLLama
  • Registratie: Oktober 2000
  • Laatst online: 20-01-2022

TheOneLLama

A llama like no llama before

Als ik jou was zou ik het op een nette manier doen, bijvoorbeeld class maken voor ieder user die inlogt (aan wie je de accept socket meegeeft). Per verbinding die gemaakt wordt maak je een object hiervan aan en die stop je in bv een Vector (er zijn snellere oplossingen waarschijnlijk). In die class heb je dan 2 threads, voor je inputstream en je outputsream, en hou je gelijk alle gegevens bij van je user.. welke nickname, ident, etc. en evt. welke channels (afhankelijk van hoe je de rest van je IRC server inelkaar zet)

Opera OpenOffice.org Jabber Psi jabber://llama@mordax.com


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 17:04
jah zo ben ik bezig op dit moment... mijn servertje is nu niets meer dan 1 serversocket die user classes/threads aanmaakt wanneer een client connect.
Elke nickname hou ik bij in een vector op deze server en zo weet ik naar welke client socket/class/thread ik moet gaan (als het een channel message is loop ik gewoon alle users af die in mijn channel class zitten, en anders is het een privmsg, maar dat is het gewoon hetzelfde principe :) )

Clowns to the left of me, Jokers to the right


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Jikes...

Hoeveel users moet je systeem aankunnen?

Per user een thread werkt goed tot op zekere hoogte. Maar daarna niet meer. Ligt ook puur aan het doel van je app.

Verwijderd

als je van elke gebruiker een class maakt en daarin de input en outputstreams defineert hoef je niks meer op te zoeken. Sla je het hele class-object op in een vector
dan krijg je zoiets :
code:
1
2
3
4
while(vector.hasNext())
{
   (Classcast) (vector.getNext()).sendMsg(iets);
}

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023

  • TheOneLLama
  • Registratie: Oktober 2000
  • Laatst online: 20-01-2022

TheOneLLama

A llama like no llama before

Op zondag 19 mei 2002 13:44 schreef The - DDD het volgende:
Jikes...

Hoeveel users moet je systeem aankunnen?

Per user een thread werkt goed tot op zekere hoogte. Maar daarna niet meer. Ligt ook puur aan het doel van je app.
Sterker nog, in JAVA <1.4 kom je al gauw uit op 2 threads per gebruiker (hoewel het met 1 ook kan). De enige non-blocking IO die je geloof ik hebt in JAVA <14 hebt is InputStream.available().

Natuurlijk staan vrijwel al die threads op IO te wachten en zijn dus niet active. Het parsen van de data die binnenkomt moet je dan niet allemaal ook in die threads gaan doen want dan komen er teveel running threads. Java 1.4 heeft meer mogelijkheden voor non-blocking IO, waardoor je minder zoveel threads hoeft te gebruiken. Ben hier nog niet echt mee bekent hoe dit in z'n werkt gaat met JAVA.

Opera OpenOffice.org Jabber Psi jabber://llama@mordax.com

Pagina: 1