Server - Client Verbindung
-
Guten Tag!
Für unser Projekt benötigen wir einen Client, welcher vom Server die aktuelle
Version ladet, sprich die locale Installation updated.Nun versuche ich mich mal an etwas einfachem, scheitere jedoch bereits daran.
Als Referenz habe ich folgendes verwendet: http://openbook.galileodesign.de/javainsel5/javainsel16_007.htm
Jedoch bleibt der Client, oder auch der Server (von meiner Seite aus schwer einzuschätzen)
bei "in.read(b);" hängen bzw. beim Debuggen springt er nicht auf die nachfolgende
Anweisung.Client:
public static void main(String[] args) { Socket server = null; try { server = new Socket( "176.28.53.175", 1213 ); ObjectInputStream in = new ObjectInputStream(server.getInputStream()); OutputStream out = server.getOutputStream(); out.write( 30 ); byte[] b = new byte[1000]; in.read(b); // nach dieser Anweisung verlässt der Debugger das Programm // beende ich jedoch den server, springt er x-mal zu dieser Anweisung String output = new String(b); System.out.println(output); System.out.println("HAHA"); } catch ( UnknownHostException e ) { e.printStackTrace(); } catch ( IOException e ) { e.printStackTrace(); } finally { if ( server != null ) try { server.close(); } catch ( IOException e ) { e.printStackTrace(); } } System.out.println("Fail"); }
Server:
private final ServerSocket server; public ProjektUpdater(int port) throws IOException { server = new ServerSocket(port); } public void startServing() { while(true) { Socket client = null; try { client = server.accept(); handleConnection(client); } catch(IOException e) { } } } private void handleConnection(Socket client) throws IOException{ InputStream in = client.getInputStream(); ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream()); String output20 = "größer 20 erhalten"; String output10 = "kleiner 20 erhalten"; if(in.read() > 20) out.write(output20.getBytes()); else out.write(output10.getBytes()); } /** * @param args the command line arguments */ public static void main(String[] args) throws IOException { ProjektUpdater update = new ProjektUpdater(1213); update.startServing(); }
Was hab ich denn hier vergeigt? Wäre um Hilfestellung dankbar.
Gruß
ITEDVOEdit: Kleiner Irrtum, wenn ich Debugge und den Server dabei schließe, geht er
weiter zur nächsten Anweisung.
-
In der Beschreibung der read() Methode steht dies:
This method blocks until input data is available, end of file is detected, or an exception is thrown.
Das heißt, du wartest wohl einfach vergeblich auf die Daten, weil nie etwas ankommt. Wenn du den Server abschiesst, dann wird die Verbindung abgebrochen und die Methode blockiert nicht mehr (laut Manual müsste eigentlich eine IOException geworfen werden).
Warum keine Daten ankommen ist jetzt für mich erstmal nicht ersichtlich. Teste vllt. erstmal nur lokal, bzw. nur in eine Richtung. Das Einbauen eines Timeouts ist sicherlich auch nicht schlecht.
-
Danke, daran lags aber jetzt auch nicht.
In der Referenz stand, dass wenn man einen BufferedOutputStream verwendet,
man die Daten mit flush raushauen soll.Ich war jedoch in der annahme, dass dies für ObjectOutputStream nicht gilt, war
jedoch nicht der fall.
-
Jetzt habe ich jedoch noch ein weiteres Problem.
Ich sende einen String zum Server und vergleiche diesen mit einem exakt gleichen
String.Jedoch sind diese ungleich, jedenfalls nach dem ich den übertragenen String von byte in String umgewandelt habe.
Mit dem Debugger erkenne ich, dass der auf dem Server deklarierte String den
Wert "12345" besitzt.Hingegen lautet der übertragene String "12345 (ohne " am schluss).
Woran kann dies liegen?
Server:
String pw = "12345"; Socket client; PrufSum pruf; public boolean Login() throws IOException { boolean ret = false; InputStream in = this.client.getInputStream(); if(in.read() == this.pruf.login) { System.out.println("Login request ordered!"); ObjectInputStream oin = new ObjectInputStream(this.client.getInputStream()); OutputStream out = this.client.getOutputStream(); byte[] b = new byte[100]; System.out.println("PW recieved!"); oin.read(b); String pw = new String(b); System.out.println("PW decoded! " + pw); if(this.pw.getBytes("UTF8") == b) { out.write(this.pruf.loginCorrect); System.out.println("Login Correct, send pruf.loginCorrect!"); } else { out.write(this.pruf.loginFail); System.out.println("Login Incorrect, send pruf.loginFail!"); } } return ret; }
Client
public boolean Login(String pw) throws IOException { boolean ret = false; OutputStream out = this.server.getOutputStream(); out.write(this.pruf.login); ObjectOutputStream objout = new ObjectOutputStream(this.server.getOutputStream()); objout.write(pw.getBytes("UTF8")); objout.flush(); InputStream inp = this.server.getInputStream(); if(inp.read() == this.pruf.loginCorrect) { System.out.println("login Correct"); } else System.out.println("login Failed"); return ret; }
PrufSum
public class PrufSum { public byte login = 0x1; public byte sql = 0x2; public byte ClientToServerSendArchive = 0x3; public byte ClientToServerRecieveArchive = 0x4; public byte ServerToClientSendArchive = 0x5; public byte ServerToClientRecieveArchive = 0x6; public byte loginFail = 0x001; public byte loginCorrect = 0x002; }
Im main vom Client aufgerufene login
Handshake hs = new Handshake(server); // hs.Login(pw); hs.Login("12345");
-
Uh je, peinlich...
byte[] b = new byte[100] <<<------ klar dass dies nich hinhaut ^^
100 bytes vorhanden, 5 stück werden gefüllt, 95 leerzeichen - hmm...
"12345" und "12345 ..." "close enough!"Edit: Ausserdem is mir aufgefallen, dass ich mich gar nich mit byte[] herumschlagen
muss, objout.writeObject() und oin.readObject() handlen dass ja schon für michSollt mich eigentlich schon langsam daran gewöhnt haben, dass mir Java so
gut wie jede Arbeit abnimmt ^^