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ß
    ITEDVO

    Edit: 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 mich 🙄

    Sollt mich eigentlich schon langsam daran gewöhnt haben, dass mir Java so
    gut wie jede Arbeit abnimmt ^^


Log in to reply