Servlet se tada kaci na localhoast server i preko ObjectOutputStreama salje request objekat sa parametrima(npr parametri su String komanda i objekat Osoba sa gore navedenim poljima). server thread, na osnovu komande, proverava da li treba da registruje korisnika ili da se loguje. proverava da li username i password vec postoji u bazi podataka i vraca servletu informaciju da li je registracija/logovanje uspesno i ako nije, zasto nije.
sve to fino funkcionise, ali bih sada hteo da dodam mogucnost da logovani korisnik uploaduje sliku kada se loguje. na netu sam nasao neki tutorijal sa kodom gde je sve objasnjeno kako da se uploaduje slika preko servleta i to funkcionise, ali me zanima, kako to da odradim preko servera sa multithreadingom? sta da posaljem na objectOutputStream? cini mi se da je upload fajlova dosta zeznutiji od obicnog logovanja, pisanja i citanja iz baze podataka.
da li gresim? gde da pocnem?
Servlet za registraciju:
Code:
String hostname = "localhost";
InetAddress addr = InetAddress.getByName(hostname);
int TCP_PORT = 9000;
Socket socket = new Socket(addr, TCP_PORT);// ip & port of server. in this moment the request is detected on server and socket is made for thread
//make in and out streams for communication with the server
ObjectOutputStream out=new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in=new ObjectInputStream(socket.getInputStream());
REQ req=new REQ();
req.getParameters().put("command","register");
req.getParameters().put("person",person);
//write to Server
out.writeObject(req);
out.flush();
Answer answer=new Answer();
try{
answer=(Answer)in.readObject();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
System.out.println("message from server: "+answer.getMessage());
String hostname = "localhost";
InetAddress addr = InetAddress.getByName(hostname);
int TCP_PORT = 9000;
Socket socket = new Socket(addr, TCP_PORT);// ip & port of server. in this moment the request is detected on server and socket is made for thread
//make in and out streams for communication with the server
ObjectOutputStream out=new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in=new ObjectInputStream(socket.getInputStream());
REQ req=new REQ();
req.getParameters().put("command","register");
req.getParameters().put("person",person);
//write to Server
out.writeObject(req);
out.flush();
Answer answer=new Answer();
try{
answer=(Answer)in.readObject();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
System.out.println("message from server: "+answer.getMessage());
Server Thread,
Code:
private Socket sock;
// stream za slanje poruka
private ObjectOutputStream out;
// stream za prijem poruka
private ObjectInputStream in;
private SessionFactory sessionFactory;
private Session session;
public ServerThread(Socket sock){
this.sock=sock;
try {
in = new ObjectInputStream(sock.getInputStream());
out = new ObjectOutputStream(sock.getOutputStream());
sessionFactory=new Configuration().configure().buildSessionFactory();
session = sessionFactory.openSession();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void run() {
System.out.println("run");
try {
//request reading
REQ req=(REQ)in.readObject();
System.out.println("OBJECT read");
String command=(String)req.getParameters().get("command");
if(command.equals("register")){
Person P = null;
P =(Person)req.getParameters().get("person");
//write the data in the DB
session.beginTransaction();
session.save(P);
session.getTransaction().commit();
session.close();
Answer answer=new Answer();
answer.setMessage("everything went fine with "+P.getUsername());
answer.setFlag(1);
answer.setPerson(P);
//send the answer to the client
out.writeObject(answer);
out.flush();
out.reset();
}
if(command.equals("login")){
System.out.println("in login part of the thread");
Person person=new Person();
String username=(String)req.getParameters().get("username");
String password=(String)req.getParameters().get("password");
session.beginTransaction();
person=(Person)session.get(Person.class, username);
session.close();
if(person.getPassword().equals(password)){
person.setLoggedIn(true);
Answer answer=new Answer();
answer.setMessage("everything went fine with "+person.getUsername());
answer.setFlag(1);
answer.setPerson(person);
System.out.println(answer.getMessage());
//send the answer to the client
out.writeObject(answer);
out.flush();
out.reset();
}else{
person.setLoggedIn(false);
Answer answer=new Answer();
answer.setMessage("wrong password from user: "+person.getUsername());
answer.setFlag(0);
answer.setPerson(person);
System.out.println(answer.getMessage());
//send the answer to the client
out.writeObject(answer);
out.flush();
out.reset();
}
}
//end of client-server communication
in.close();
out.close();
sock.close();
}
private Socket sock;
// stream za slanje poruka
private ObjectOutputStream out;
// stream za prijem poruka
private ObjectInputStream in;
private SessionFactory sessionFactory;
private Session session;
public ServerThread(Socket sock){
this.sock=sock;
try {
in = new ObjectInputStream(sock.getInputStream());
out = new ObjectOutputStream(sock.getOutputStream());
sessionFactory=new Configuration().configure().buildSessionFactory();
session = sessionFactory.openSession();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void run() {
System.out.println("run");
try {
//request reading
REQ req=(REQ)in.readObject();
System.out.println("OBJECT read");
String command=(String)req.getParameters().get("command");
if(command.equals("register")){
Person P = null;
P =(Person)req.getParameters().get("person");
//write the data in the DB
session.beginTransaction();
session.save(P);
session.getTransaction().commit();
session.close();
Answer answer=new Answer();
answer.setMessage("everything went fine with "+P.getUsername());
answer.setFlag(1);
answer.setPerson(P);
//send the answer to the client
out.writeObject(answer);
out.flush();
out.reset();
}
if(command.equals("login")){
System.out.println("in login part of the thread");
Person person=new Person();
String username=(String)req.getParameters().get("username");
String password=(String)req.getParameters().get("password");
session.beginTransaction();
person=(Person)session.get(Person.class, username);
session.close();
if(person.getPassword().equals(password)){
person.setLoggedIn(true);
Answer answer=new Answer();
answer.setMessage("everything went fine with "+person.getUsername());
answer.setFlag(1);
answer.setPerson(person);
System.out.println(answer.getMessage());
//send the answer to the client
out.writeObject(answer);
out.flush();
out.reset();
}else{
person.setLoggedIn(false);
Answer answer=new Answer();
answer.setMessage("wrong password from user: "+person.getUsername());
answer.setFlag(0);
answer.setPerson(person);
System.out.println(answer.getMessage());
//send the answer to the client
out.writeObject(answer);
out.flush();
out.reset();
}
}
//end of client-server communication
in.close();
out.close();
sock.close();
}
p.s. ne znam da li da okacim ceo kod-ima ga bas dosta pa nisam hteo da zatrpavam
pp.s. nisam siguran da sam na dobrom mestu kreirao sesiju za hibernate(u konstruktoru ServerThread-a)? kako je u pitanju 'skup' objekat, hteo sam da ga kreiram samo jednom pa posle da se koristi taj isti, ali niti sam siguran da sam to uspeo niti sam siguran da je to dobro resenje.
govorim o ovom delu koda:
Code:
sessionFactory=new Configuration().configure().buildSessionFactory();
session = sessionFactory.openSession();
sessionFactory=new Configuration().configure().buildSessionFactory();
session = sessionFactory.openSession();