[Java] Client Server App multiple OutputStreams

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Ik ben een beetje aan het spelen met java, en ik wil graag het volgende maken.

[Database] <--> [Server] <--> [Client].
Waarbij het dus de bedoeling is dat d.m.v het client script een aantal methodes worden uitgevoerd in het Server script.

De communicatie tussen database en server is in orde.
De communicatie tussen client en server is orde, hoewel dit nog gelimiteerd is tot 1 client
is er op dit moment nog geen behoefte aan meerdere clients.

Ik wil graag dat de client een pasnummer en een pincode stuurt,
waarmee de server een query kan uitvoeren op de database.

Client code Send passnummer en Pincode:
Java:
1
2
3
4
5
6
7
8
9
10
11
sock = new java.net.Socket(serverIPname,serverPort);                                                       
//Create streams                                                                                   
pw   = new java.io.PrintWriter(sock.getOutputStream(), true);                                      
br   = new java.io.BufferedReader(new java.io.InputStreamReader(sock.getInputStream()));           
System.out.println("Connected to Server");                                                         
                                                                                                                    
//send tekst to server                                                                                  
pw.println(+nummer);                                                                                     
System.out.println("I send banknummer: " +nummer);                                                       
pw.println(+pincode);                                                                                    
System.out.println("I send pincode: " +pincode);    


Server code readlines
Java:
1
2
3
4
5
6
7
8
pw   = new java.io.PrintWriter(clientSocket.getOutputStream(),true);                                  
br   = new java.io.BufferedReader(new java.io.InputStreamReader(clientSocket.getInputStream()));         
            for (int a = 0; a <= 1; a++)                                                
                {                                                                       
                    String nummer = br.readLine();                                      
                    System.out.println("Message from the client: " +nummer);            
                    pw.println("ik heb ontvangen als nummer: " +nummer);                
                }     


Nu krijg ik inderdaad netjes alle lines te zien die worden verstuurd vanaf de client.
Nu moet ik alleen zorgen dat line 1 die ik verzend nummer is, en line 2 pincode.
Ik denk niet dat de for loop die ik gebruik de beste oplossing is, ook levert dit problemen
op als ik later meerdere lines wil gaan verzenden.

Hoe zou ik dit moeten aanpakken?

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik weet niet wat je uiteindelijke doel is en of je gewoon aan 't stoeien bent om spelenderwijs wijzer te worden (doen we allemaal wel eens graag op z'n tijd :P ) maar waarom gebruik je niet gewoon iets als XML over HTTP, SOAP, DCOM of whatever? Scheelt je op dusdanig laag niveau denken dat je je kunt focussen op de zaken die er wél toe doen ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Ik ben gewoon aan het spelen met Java, dit is ook overigens de enige programmeertaal die ik probeer te leren.
Aan de ene kant voor school, we zijn daar veel bezig met Java. Aan de andere kant vind ik het wel leuk om dit soort dingen te maken. Ook ben ik verbaasd over het feit dat het verschrikkelijk makkelijk is om een client-server verbinding op te zetten.

Ik zal zeker even kijken naar de door jou aangeraden manieren. Hoewel ik totaal niet bekend ben met die methodes, heb ik misschien wel wat aan. Maar ben er ook van overtuigd dat wat ik wil/vraag zeer makkelijk te realiseren moet zijn.

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
echo "Mag ik je pin?"
String regel = leesString()
int pin = parse(regel)
echo "Mag ik je pasnummer?"
String regel = leesString();
int nummer = parse(regel);

LMD :)

https://niels.nu


Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 23-09 15:51
Ik denk dat je voor nu hier gebruik van moet maken, om alvast te leren hoe de RMI/SOAP/.. werkt.

Die for() loop werkt inderdaad niet. Daar ga je maar 1 keer doorheen ;)
Die br.readline() leest een regel van de inputStream tot een nieuwe regel.
Je kunt dan beter een while() gebruiken en controleren of je nog nieuwe data binnenkrijgt.

Java:
1
2
3
4
5
6
7
String data = "";
while( (data = br.readline()) > 0 )
{
  // doe iets met data;
  // misschien nog een exit conditie:
  if( "exit".equals(data) ) break;
}


Er zijn legio voorbeelden te vinden (bijvoorbeeld hier).

let the past be the past.


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
SPee schreef op vrijdag 30 januari 2009 @ 11:58:
Ik denk dat je voor nu hier gebruik van moet maken, om alvast te leren hoe de RMI/SOAP/.. werkt.
Waarom? Laat 'em eerst lekker ontdekken hoe socketcommunicatie werkt. Leuk en leerzaam.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 23-09 16:29
Het is trouwens niet handig om de OutputStream van een Socket te wrappen met een PrintWriter (of PrintStream) en dan println() te gebruiken om regels tekst heen en weer te versturen. Deze methoden (alle overloaded varianten) maken gebruik van de system property "line.separator", welke dus platform specifiek is.
Wanneer je via sockets gaat communiceren tussen verschillende platformen, kan die systeem property dus heel goed in verschillende line-breaking waarden voorzien. Dit kan voor probelmen zorgen.

Acties:
  • 0 Henk 'm!

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
@Hydra
Hydra schreef op vrijdag 30 januari 2009 @ 11:42:
[...]
echo "Mag ik je pin?"
String regel = leesString()
int pin = parse(regel)
echo "Mag ik je pasnummer?"
String regel = leesString();
int nummer = parse(regel);
Dan moet ik nog steeds een tweede manier vinden om die regel te lezen.
Gewoon de code herhalen werk niet en is ook niet praktisch.

Voor alle duidelijkheid je bedoelt dit toch?
Java:
1
2
3
4
5
6
7
String snummer = br.readLine();                                      
int nummer = parse snummer;
System.out.println("Message from the client: " +nummer);            
pw.println("ik heb ontvangen als nummer: " +nummer);
String scode = br.readline();
int code = parse scode;
etc?


@Spee
String data = "";
while( (data = br.readline()) > 0 )
{
// doe iets met data;
// misschien nog een exit conditie:
if( "exit".equals(data) ) break;
}
Dit zou ik kunnen doen en dan bv. met een if/else eruit halen of het een pincode of nummer is.

Geplaatst op vrijdag 30 januari 2009 12:06

@ FallenAngel666
Wat stel jij voor om te gebruiken dan?

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
battler schreef op vrijdag 30 januari 2009 @ 13:23:
@Hydra

[...]


Dan moet ik nog steeds een tweede manier vinden om die regel te lezen.
Gewoon de code herhalen werk niet en is ook niet praktisch.

Voor alle duidelijkheid je bedoelt dit toch?
Java:
1
2
3
4
5
6
7
String snummer = br.readLine();                                      
int nummer = parse snummer;
System.out.println("Message from the client: " +nummer);            
pw.println("ik heb ontvangen als nummer: " +nummer);
String scode = br.readline();
int code = parse scode;
etc?
Wat 'werkt niet'?

Je wilt twee afzonderlijke regels tekst lezen kennelijk? Wat is het probleem?

https://niels.nu

Pagina: 1