Socket Client mit hash authentifizieren

uri

Neues Mitglied
Hallo, ich soll einen kommandozeilenbasierten Client implementieren, dass dateien vom/auf dem Server downloaden/uploaden kann.
Ich muss mich allerdings mit einem hashwert authentifizieren, den ich über eine Klasse Authentificator mit MD5 generiere und mir fehlt der Ansatz, wie ich diesen Hashwert dem Server übergebe und überhaupt was ich da eigentlich zurückbekommen soll.

Java:
public class Client1 {
   

    public static final String FIRST_NAME = "Max";
    public static final String LAST_NAME = "Mueller";

    public static void main(String[] args) throws UnknownHostException, IOException {

        try {
            byte[] hash = Authenticator.getHash(FIRST_NAME, LAST_NAME);
            Socket s = new Socket("52.28.100.108", 8080);
            s.getOutputStream().write(hash);
            System.out.println(s.getInputStream().read()); // return 3
            s.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Ich hoffe mir kann einer helfen.

MfG

Uri
 
Naja, du "übergibst" dem Server doch schon das byte-array hash ._.
Das ganze wird jetzt im beim Server angemeldeten (socket = serverSocket.accept()) socket im inputStream zu finden sein.
Oder was genau meinst du hier?
 
Probier mal diese Klassen aus: https://github.com/DeBukkIt/SimpleServerClient
Damit hast du eine ganz einfache Vorlage für alle möglichen Server-Client-Anwendungen, die du brauchen könntest. Wenn du dich einmal durch die kurze Anleitung gearbeitet hast, kannst du damit problemlos eine sichere Verbindung zum Server aufbauen und deinen Hash übergeben, sowie eine Antwort erhalten, die du auswerten kannst.

Füge die Klassen von https://github.com/DeBukkIt/SimpleServerClient in dein Projekt ein und implementiere danach deine eigenen Klassen wir folgt:

Der Server
Java:
import java.net.Socket;

import com.feuerwehrhorstmar.www.Util.Datapackage;
import com.feuerwehrhorstmar.www.Util.Executable;
import com.feuerwehrhorstmar.www.Util.Server;

public class MyServer extends Server {

    public MyServer(int port) {
        super(port);
    }

    @Override
    public void preStart() {
        registerMethod("AUTH", new Executable() {
            @Override
            public void run(Datapackage msg, Socket socket) {
                sendMessage(new Datapackage("REPLY", isLoginCorrect((byte[]) msg.get(1))), socket);
            }
        });
    }

    private boolean isLoginCorrect(byte[] bytes){
        //Hier deinen Login überprüfen, dann return true/false;
    }

}

Dein Client
Java:
import java.net.Socket;

import com.feuerwehrhorstmar.www.Util.Client;
import com.feuerwehrhorstmar.www.Util.Datapackage;
import com.feuerwehrhorstmar.www.Util.Executable;

public class MyClient extends Client {

    public MyClient(String address, int port, int timeout, boolean autoKill) {
        super(address, port, timeout, autoKill);
        start();
    }

    public boolean authenticate(String FIRST_NAME, String LAST_NAME){
        byte[] hash = Authenticator.getHash(FIRST_NAME, LAST_NAME);
        return (Boolean) sendMessage(new Datapackage("AUTH", hash)).get(1);
    }

}

Deine main-Methode auf der Client-Seite
Java:
 public static void main(String[] args) {
        Client meinClient = new Client("52.28.100.108", 8080, 10000, false);
        System.out.println("Eingeloggt? :: " + meinClient.authenticate(FIRST_NAME, LAST_NAME));
    }
 
Liegt der Server überhaupt in deiner Verantwortlichkeit? Wenn ja, sollte aus dessen Implementation ersichtlich sein, wie der Client sich anmeldet.
Wenn Nein, wird's zu dem Server Doku geben, in der drin steht, wie das geht, ohne kann man da nur wenig zu sagen 😉
 

Zurück
Oben