Socket Java Server - Username + Heslo ? – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Socket Java Server - Username + Heslo ? – Java – Fórum – Programujte.comSocket Java Server - Username + Heslo ? – Java – Fórum – Programujte.com

 

Johnny
~ Anonymní uživatel
23 příspěvků
23. 3. 2014   #1
-
0
-

 Ahoj, rád bych si u tohoto kódu vytvořil jednoduchou autentizaci. Kdy Server po spuštění bude vyžadovat Username, po zadání do konzole si ho uloží a dále bude vyžadovat Password, což bude číslo, které bude součtem ASCII hodnot zadaného Username. Bohužel ale nevím, jak nastavit server, aby tyto dva požadavky obsloužil za sebou a uložil si je ? Za pomoc budu velice rád !

Napadlo mě vytvořit si dvě metody, kde by každá do jisté míry kopírovala while smyčku z metody RUN, ale nějak se mi to nedaří. Díky za případné rady a tipy.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Jenda
 */
public class Server extends Thread {

    Socket s;

    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(5222);
            while (true) {
                Socket s = ss.accept();
                Server srv = new Server();
                srv.s = s;
                srv.start();
            }
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /*Tady si měl jako vstupní parametr "Socket s" takže ti to
bralo z toho, ale už si nikde tomu vláknu neřekl kde to "s"
má vzít. Zkus to takhle.*/
    @Override
    public void run() {
        try {
            InputStream is = s.getInputStream(); //ze site
            OutputStream os = s.getOutputStream(); // to co ja posilam do site
            BufferedReader br = new BufferedReader(new InputStreamReader(is)); //obaleni buffered abych mohl cist po celych radcich
            String str;
            while ((str = br.readLine()) != null) {
                System.out.println(">> " + str);
                str = "SRV: " + str + "\n";
                os.write(str.getBytes());
            }
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
Nahlásit jako SPAM
IP: 147.32.96.–
z
~ Anonymní uživatel
268 příspěvků
24. 3. 2014   #2
-
0
-

Příjem dat už tam máš, tak snad není problém nejdřív načíst to jméno a heslo a až pak pokračovat. Nechápu v čem je problém. Ukaž co přesně ti nefunguje.

Nahlásit jako SPAM
IP: 88.101.8.–
Johnny
~ Anonymní uživatel
23 příspěvků
24. 3. 2014   #3
-
0
-

#1 Johnny 

Nakonec jsem to trošku předělal. A myslel sem, že ty údaje zvládnu načíst jen v run(), ale to asi ne. Tak se snažím udělat dvě další metody, které mi ale přijdou že mají pracovat stejně.

public class Server extends Thread {

    StringBuilder sb = new StringBuilder();
    int indicator = 0;
    Socket socket;
    String name = "";
    String password = "";

    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(3618);
            while (true) {
                Socket s = ss.accept();
                Server srv = new Server();
                srv.socket = s;
                srv.start();
            }
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    @Override
    public void run() {
        try {
            String str = "";
            int chars;
            int ch = 0;
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            //sendMessage("200" + " " + "LOGIN" + "\r\n", out);
            username();
            password();

            System.out.println(name);
            System.out.println(password);

            while ((chars = in.read()) != -1) {
                sb.append((char) chars);
                str = sb.toString();

                if (!name.equals(str)) {
                    name = str;
                    sendMessage("PASSWORD\r\n", out);
                }
                if (Integer.parseInt(str) == Integer.parseInt(name)) {
                    sendMessage("JE TO OK\r\n", out);
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    void sendMessage(String message, PrintWriter pw) {
        pw.write(message);
        pw.flush();
    }

    int passwordCheck(String s) {
        int sum = 0;
        for (int i = 0; i < s.length(); i++) {
            sum += s.charAt(i);
        }
        return sum;
    }

    void username() throws IOException {
        String str = "";
        int chars;
        int ch = 0;
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        sendMessage("200" + " " + "LOGIN" + "\r\n", out);

        while ((chars = in.read()) != -1) {
            sb.append((char) chars);
            str = sb.toString();
            if (str.contains("\r\n")) {
                name = str;
            }
        }
    }

    void password() throws IOException {
        String str = "";
        int chars;
        int ch = 0;
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        sendMessage("201" + " " + "PASSWORD" + "\r\n", out);

        while ((chars = in.read()) != -1) {
            sb.append((char) chars);
            str = sb.toString();
            if (str.contains("\r\n")) {
                password = str;
                break;
            }
        }
    }
}


Nahlásit jako SPAM
IP: 147.32.96.–
lukber0
Newbie
24. 3. 2014   #4
-
0
-

Nedávno jsem řešil něco podobného. Měl jsem zadání takovéto:

  • Vytvorit JAVA aplikaci (do prikazove radky), ktera by bezela jako TCP server na zvolenem portu
  • Po prihlaseni pres telnet by poslala na klienta text „Username:“ a cekala na zadani jmena uzivatele
  • Nasledne by poslala text „Password:“ a cekala na zadani hesla
  • Overeni uzivatel/heslo by bylo provedeno proti nejake DB (pres JDBC, Hibernate, ... cokoliv)
  • Heslo by v DB nemelo byt v „citelnem“ stavu
  • Po provedeni overeni proti DB by aplikace poslala na klienta  „OK“ nebo „Chyba“

Zde je výsledný kód:

/**
 * Registrace posluchace na portu 23 pokud neni predan jiny.
 * 
 * Inspirace konstrukce ServerSocket z <a href=
 * "http://docs.oracle.com/javase/tutorial/networking/sockets/examples/KKMultiServer.java"
 * >KKMultiServer.java</a>
 * 
 * @author Lukas
 */
public class TCPServer {

	private static final int DEFAULT_PORT = 23;

	public static void main(String[] args) {
		int port = (args.length == 1) ? parsePortNumber(args[0], DEFAULT_PORT) : DEFAULT_PORT;

		System.out.println("Startuji server na portu: " + port);
		try (ServerSocket serverSocket = new ServerSocket(port)) {

			while (true) {
				Socket clientSocket = serverSocket.accept();
				new Thread(new TCPServerThread(clientSocket)).start();
			}
		} catch (IOException e1) {
			System.err.println("Chyba pri vytvareni posluchace na portu:" + port);
			System.exit(-1);
		}
	}

	/**
	 * Parsuje cislo portu z retezce. Pokud nastala chyba pri parsovani, tak je
	 * vracena defaultni hodnota
	 * 
	 * @param portNumber
	 *            Hodnota pro parsovani
	 * @param defaultPort
	 *            Defaultni hodnota portu ktera je vracena pri chybe
	 * @return cislo portu
	 */
	private static int parsePortNumber(String portNumber, int defaultPort) {
		int number = defaultPort;
		try {
			number = Integer.valueOf(portNumber);
		} catch (NumberFormatException e) {
			System.out.println("Cislo portu " + portNumber + " neni ve spravnem formatu.");
		}

		return number;
	}

}







/**
 * Trida zabezpecujici komunikaci s klientem
 * 
 * @author Lukas
 */
public class TCPServerThread implements Runnable {

	private Socket clientSocket;

	public TCPServerThread(Socket clientSocket) {
		this.clientSocket = clientSocket;
	}

	@Override
	public void run() {
		try (
			PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
			BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
		) {
			// zadani uzivatelskeho jmena
			out.print("Username:");
			out.flush();
			String userName = in.readLine();

			// zadani hesla
			out.print("Password:");
			out.flush();
			String password = in.readLine();
			
			// kontrola zadanych udaju
			if (TCPServerAuthService.signIn(userName, password)) {
				out.println("OK");
			} else {
				out.println("Chyba");
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				clientSocket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}



public class TCPServerAuthService {

	private static final String DB_URL = "localhost";
	private static final String DB_PORT = "5432";
	private static final String DB_DATABASE_NAME = "TCPServer";
	private static final String DB_USER_NAME = "tcpserver_app";
	private static final String DB_PASSWORD = "heslo";

	/**
	 * Overeni uzivatelskeho jmena a hesla. Heslo generovane v SHA-1. Generator
	 * je <a href="http://www.sha1.cz/">zde</a>.
	 * 
	 * @param userName
	 * @param password
	 * @return TRUE - zadano spravne
	 */
	public static boolean signIn(String userName, String password) {
		String sql = "SELECT count(1) FROM login WHERE login_username=? AND login_password=?";

		try (
			Connection conn = DriverManager.getConnection("jdbc:postgresql://" + DB_URL + ":" + DB_PORT + "/" + DB_DATABASE_NAME, DB_USER_NAME, DB_PASSWORD); 
			PreparedStatement stmt = conn.prepareStatement(sql);
		) {
			String password_hash = toSHA1(password).toLowerCase();
			System.out.println("Overeni uzivatelskeho jmena: " + userName + "/" + password_hash);
			
			stmt.setString(1, userName);
			stmt.setString(2, password_hash);

			ResultSet resultSet = stmt.executeQuery();
			resultSet.next();
			int rowCount = resultSet.getInt(1);
			return rowCount == 1;
		} catch (Exception e) {
			System.err.println("Overovani uzivatelskeho jmena a hesla se nezdarilo: " + e.getClass().getName() + ": " + e.getMessage());
		}

		return false;
	}

	/**
	 * Prevod textu na SHA-1.
	 * 
	 * Prevzato z <a
	 * href="http://stackoverflow.com/questions/4895523/java-string-to-sha1"
	 * >stackoverflow.com</a>
	 * 
	 * @param value
	 * @return
	 */
	private static String toSHA1(String value) {
		final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
		MessageDigest md = null;
		try {
			md = MessageDigest.getInstance("SHA-1");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		byte[] buf = md.digest(value.getBytes());
		char[] chars = new char[2 * buf.length];
		for (int i = 0; i < buf.length; ++i) {
			chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
			chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
		}
		return new String(chars);
	}
}


Je tam toho víc než by jsi potřeboval. Tobě bude stačit, když si upravíš třídu TCPServerAuthService

Nahlásit jako SPAM
IP: 89.103.94.–
Johnny
~ Anonymní uživatel
23 příspěvků
24. 3. 2014   #5
-
0
-

 Nakonec jsem to předělal na tenhle kod. A připojuju se k tomuhle bežícímu serveru pres windows cmd. Přesněji telnet localhost <portnumber> a po připojení komunikuji se serverem přes protokol TCP. Potřeboval bych tedy vyřešit tu komunikaci když do bežící příkazovky napíšu text, aby mi ho server přijal a uložil pro další zpracování.

public class Server extends Thread {
 
    StringBuilder sb = new StringBuilder();
    int indicator = 0;
    Socket socket;
    String name = "";
    String password = "";
 
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(3618);
            while (true) {
                Socket s = ss.accept();
                Server srv = new Server();
                srv.socket = s;
                srv.start();
            }
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    @Override
    public void run() {
        try {
            String str = "";
            int chars;
            int ch = 0;
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 
            while ((chars = in.read()) != -1) {
                sb.append((char) chars);
                str = sb.toString();
            }
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
 
    void sendMessage(String message, PrintWriter pw) {
        pw.write(message);
        pw.flush();
    }
Nahlásit jako SPAM
IP: 147.32.96.–
lukber0
Newbie
24. 3. 2014   #6
-
0
-

Mrkni se jak je udělany TCPServerThread komentář // zadani uzivatelskeho jmena

Máš "IN" a "OUT" Stream a řeší se to stejně jako kdyby jsi to dělal lokálně. 

...
// zadani uzivatelskeho jmena
out.print("Username:");
out.flush();	// posle na klienta text Username:
String userName = in.readLine();	// Ceka dokud klient nezada nejaky text a klepne na enter. To co uživatel zadal se posle na server a ulozi do promenne userName
...


Jednoduché ne?

Nahlásit jako SPAM
IP: 89.103.94.–
Johnny
~ Anonymní uživatel
23 příspěvků
24. 3. 2014   #7
-
0
-

Hehe, to je tím, že neumím pracovat se Streamama :) díky moc ! :) vyřešeno :)

Nahlásit jako SPAM
IP: 147.32.96.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 73 hostů

Podobná vlákna

TCP Socket Server Java — založil wiston

Socket server Client — založil zyxelczech

MS SQL SERVER SA HESLO — založil kironet

Java klient + C server — založil Dejv

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý