Hehe, to je tím, že neumím pracovat se Streamama :) díky moc ! :) vyřešeno :)
Příspěvky odeslané z IP adresy 147.32.96.–
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();
}
#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;
}
}
}
}
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);
}
}
}