Witam,
Piszę podstawową aplikację składającą się z Serwera, który łączy się z bazą danych mysql oraz Klienta. Klient wysyła jakieś żądanie do Serwera, a ten sprawdza to w bazie danych i odsyła obiekt czy też informację z powrotem.
Póki co chce zrobić logowanie na kliencie z weryfikacją danych logującego na serwerze (imię, nazwisko, hasło naszego pracownika).
Problem polega na tym, że nie mogę odebrać wysyłanych danych na serwerze. Kiedy przesyłam obiekt "Employee" dostaję wyjątek:
"java.net.SocketException: Software caused connection abort: socket write error"
Próbowałem sprawdzić wysyłając tylko int'a przy pomocy metod writeInt() i readInt(). Nie ma błędu, ale nie mogę odczytać odebranej (o ile w ogóle ją odbiera) liczby, przykładowo operacja wypisania jej na konsolę serwera nic nie wyświetla.
Co robię źle? Z góry dziękuję za pomoc !
Kod na Serwerze:
// Komunikacja (Obsługa) z klientem
class ClientCommunication implements Runnable {
private Socket incoming;
public ClientCommunication(Socket clientSocket) {
incoming = clientSocket;
}
public void run() {
try {
synchronized (this) {
try {
serverObjectOutput = new ObjectOutputStream(
incoming.getOutputStream());
serverObjectInput = new ObjectInputStream(
incoming.getInputStream());
} finally {
incoming.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
synchronized(this) {
while (true) {
try{
int operation = serverObjectInput.readInt();
console.append("Operation: " + operation);
switch(operation) {
case 1:
Employee employee = (Employee) serverObjectInput.readObject();
String SelectUserDataSQL = "SELECT COUNT(*) AS COUNT FROM pracownik where Imie = ? AND Nazwisko = ? AND Haslo = ?";
PreparedStatement CheckEmployeeLogin;
CheckEmployeeLogin = conn.prepareStatement(SelectUserDataSQL);
CheckEmployeeLogin.setString(1, employee.getFirstName());
CheckEmployeeLogin.setString(2, employee.getLastName());
CheckEmployeeLogin.setString(3, new String(employee.getPassword()));
ResultSet resultSQL = CheckEmployeeLogin.executeQuery();
if (resultSQL.next())
if (resultSQL.getInt("COUNT") == 0)
serverObjectOutput.writeInt(1);
else serverObjectOutput.writeInt(-1);
break;
}
} catch(IOException | ClassNotFoundException | SQLException ex)
{
}
}
}
}
}
// Otworzenie serwera, podłączenie z BD, wywoływanie wątku
// "ClientCommunication" przy nowym podlaczeniu
class ServerStart implements Runnable {
private int portNumber;
public ServerStart(int portNumber) {
this.portNumber = portNumber;
}
public void run() {
// Podlaczenie do bazy danych
try {
conn = getConnection();
stat = conn.createStatement();
showSuccess("Połączono z Baza danych.");
console.append(dateFormat.format(new Date())
+ " Połączono z bazą danych\n");
} catch (SQLException e1) {
console.append(dateFormat.format(new Date())
+ " Błąd połaczenia z Baza danych.\n");
showFailure("Błąd przy tworzeniu połączenia z Baza danych");
e1.printStackTrace();
} catch (IOException e1) {
console.append(dateFormat.format(new Date())
+ " Błąd połaczenia z Baza danych.\n");
showFailure("Błąd przy tworzeniu połączenia z Baza danych #2");
e1.printStackTrace();
} catch (InterruptedException e) {
showFailure("Nieoczekiwane zamknięcie połączenia.");
console.append(dateFormat.format(new Date())
+ " Nieoczekiwane przerwanie.\n");
e.printStackTrace();
}
// Otwarcie gniazda Serwera
try {
serverSocket = new ServerSocket(portNumber);
showSuccess("Uruchomiono server.");
off.setEnabled(true);
on.setEnabled(false);
info.setEnabled(true);
part.setEnabled(true);
console.append(dateFormat.format(new Date())
+ " Włączono serwer.\n");
} catch (IOException e) {
e.printStackTrace();
console.append(dateFormat.format(new Date())
+ " Błąd podczas włączania serwera.\n");
showFailure("Błąd przy tworzeniu gniazda.");
}
// Podlaczanie nowych klientow
try {
while (true) {
Socket incoming = serverSocket.accept();
clientSockets.add(incoming);
console.append(dateFormat.format(new Date()) + " Anonymous"
+ clientSockets.indexOf(incoming)
+ " has been connected to the server.\n");
Runnable r = new ClientCommunication(incoming);
Thread t = new Thread(r);
t.start();
}
} catch (IOException e) {
e.printStackTrace();
// showFailure("Klient nie zdołał się podłączyć");
}
}
// Podlaczanie do DB
public Connection getConnection() throws SQLException, IOException,
InterruptedException {
Properties props = new Properties();
try (InputStream in = Files.newInputStream(Paths
.get("database.properties"))) {
props.load(in);
}
String drivers = props.getProperty("jdbc.drivers");
if (drivers != null)
System.setProperty("jdbc.drivers", drivers);
String url = props.getProperty("jdbc.url");
console.append(dateFormat.format(new Date())
+ "Oczekiwanie na polaczenie z baza danych." + "\n");
LoginFrame login = new LoginFrame();
return DriverManager.getConnection(url, login.getUserName(), new String(login.getUserPassword()));
}
}
Kod na Kliencie:
public void actionPerformed(ActionEvent e) {
if (isConnected == false) {
String ServerIP = ip.getText().trim();
//ip.setEditable(false);
int ServerPort = Integer
.parseInt(port.getText().trim());
//port.setEditable(false);
try {
ClientSocket = new Socket(ServerIP, ServerPort);
// Utworzenie streamerów wejsciowych/wyjsciowych
clientObjectInput = new ObjectInputStream(
ClientSocket.getInputStream());
clientObjectOutput = new ObjectOutputStream(
ClientSocket.getOutputStream());
showSuccess();
isConnected = true;
} catch (IOException ex) {
ip.setEditable(true);
port.setEditable(true);
showFailure();
}
synchronized (this) {
try {
ClientLoginFrame login = new ClientLoginFrame();
Employee employee = login.getEmployee();
clientObjectOutput.writeInt(1);
clientObjectOutput.writeObject(employee);
int result = clientObjectInput.readInt();
if(result == 1)
{
tabs.setEnabledAt(2, true);
tabs.setEnabledAt(3, true);
tabs.setEnabledAt(4, true);
tabs.setEnabledAt(5, true);
tabs.setEnabledAt(6, true);
tabs.setEnabledAt(0, false);
tabs.setEnabledAt(1, false);
tabs.setSelectedIndex(2);
create.setEnabled(true);
logout.setEnabled(true);
showComm("Zalogowano do Systemu.");
}
else {
ClientSocket.close();
showComm("Błąd. Złe dane logowania.");
}
} catch (IOException ex) {
ex.printStackTrace();
showComm("Błąd przy przesyłaniu obiektu.");
}
}
}
}
});
add(new JPanel());
jp4.add(connect);
add(jp4);
}