Hallo,
Ich bin dabei mir eine Client-Server-Desktop-Chat-App mit angebundener DB zu basteln und bin beim Testen auf ein Problem gestoßen. Folgendes sind meine Klassen:
Ich führe in IntelliJ als erstes die main von Server aus, dann von Controller. Das Programm terminiert mit exit status 0, allerdings wird in meiner DB kein neuer Eintrag in messages zugefügt. Ich weiß, dass die Lösung per String für unterschiedliche Request Typen nicht gut ist, was besseres ist mir leider auf die schnelle nicht eingefallen.
Kann mir jemand sagen warum die Nachricht vom Request Objekt nicht in meine DB eingetragen wird?
Ich bin dabei mir eine Client-Server-Desktop-Chat-App mit angebundener DB zu basteln und bin beim Testen auf ein Problem gestoßen. Folgendes sind meine Klassen:
Java:
public class Request implements Serializable {
private Map<String,String> data = new HashMap<>();
private final String type;
String getType(){
return this.type;
}
public Request(String type){
this.type = type;
}
public void setAttribute(String key, String value){
data.put(key,value);
}
public String getAttribute(String key){
return data.get(key);
}
}
Java:
import java.io.*;
import java.net.*;
import java.sql.*;
public class Server {
private int port;
private ServerSocket serverSocket;
private Socket clientSocket;
private PrintWriter out;
private BufferedReader in;
private Connection connection;
public Server (int port){
this.port = port;
}
public void addMessage(Request request){
try {
if (!request.getType().equals("message")){
throw new RuntimeException("Error, Request Object is not of type message.");
}
Statement statement = connection.createStatement();
String sql = "insert into messages values (default" + "'" + request.getAttribute("sender")
+ "'" + "," + "'" + request.getAttribute("receiver") + "'" + "," + "'"
+ request.getAttribute("message") + "'" + ");";
statement.executeUpdate(sql);
}
catch (Exception e){
e.printStackTrace();
}
}
//TODO: WHAT HAPPENS ON THE CLIENT SIDE WHEN THIS ARRIVES?
public void sendMessage(ResultSet resultSet){
out.println(resultSet);
}
public void addUser(Request request){
try {
if (!request.getType().equals("adduser")){
throw new RuntimeException("Error, Request Object is not of type adduser");
}
Statement statement = connection.createStatement();
String sql = "insert into users values (default," + "'" + request.getAttribute("firstname") + "'" + ","
+ "'" + request.getAttribute("lastname") + "'" + ");";
statement.executeUpdate(sql);
}
catch (Exception e){
e.printStackTrace();
}
}
public void start(){
try{
connection = DriverManager.
getConnection("jdbc:mysql://localhost:3306/Whatsapp","******","**********");
}
catch (Exception e){
e.printStackTrace();
}
boolean running = true;
try {
while (running) {
serverSocket = new ServerSocket(this.port);
clientSocket = serverSocket.accept();
ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(clientSocket.getInputStream()));
Request request = (Request) in.readObject();
String type = request.getType();
switch (type) {
case "message":
this.addMessage(request);
System.out.println("addMessage(request) was called.");
break;
case "adduser":
this.addUser(request);
break;
case "quit":
running = false;
break;
default:
break;
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args){
Server server = new Server(6666);
server.start();
}
}
Java:
import java.io.*;
import java.net.Socket;
public class Controller {
private Socket clientSocket;
private ObjectOutputStream out;
private ObjectInputStream in;
private final String serverIP;
private final int serverPort;
public Controller(String ip, int port){
serverIP = ip;
serverPort = port;
}
public void sendRequest(Request request){
try {
clientSocket = new Socket(this.serverIP, this.serverPort);
ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
//ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(clientSocket.getInputStream()));
out.writeObject(request);
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[]args){
Controller controller = new Controller("localhost",6666);
Request message = new Request("message");
message.setAttribute("sender","1");
message.setAttribute("receiver","2");
message.setAttribute("id","default");
message.setAttribute("message","hello friend!");
controller.sendRequest(message);
Request quit = new Request("quit");
controller.sendRequest(quit);
}
}
Ich führe in IntelliJ als erstes die main von Server aus, dann von Controller. Das Programm terminiert mit exit status 0, allerdings wird in meiner DB kein neuer Eintrag in messages zugefügt. Ich weiß, dass die Lösung per String für unterschiedliche Request Typen nicht gut ist, was besseres ist mir leider auf die schnelle nicht eingefallen.
Kann mir jemand sagen warum die Nachricht vom Request Objekt nicht in meine DB eingetragen wird?