Zapisywanie i odczytywanie obiektów/danych z Socketów

Odpowiedz Nowy wątek
2014-12-27 00:56
0

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);
        }   

Pozostało 580 znaków

2014-12-27 03:01
0

Umieram trochę środku jak widzę taki kod. Właściwie nic w nim nie jest dobrze, no ale cóż, nie każdemu dane jest zostać programistą. Mam nadzieję że ty nie masz tego w planach. Kod jest napisany tragicznie, nieczytelnie i generalnie sam za 3 dni nie będziesz wiedział co się w nim dzieje. I dare you, skasuj to:

                                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);

Nie zaglądaj do tego projektu aż do nowego roku a potem spróbuj to napisać z pamięci. Ciekawe czy będziesz pamiętał o co w ogóle chodziło i które numerki masz zrobić enabled a które disabled...

Tak czt siak, twój największy błąd jest tu:

                } catch(IOException | ClassNotFoundException | SQLException ex)                    
                {                    

Pusty catch wewnątrz while(true) oznacza że guzik wiesz co się w ogóle dzieje z kodem. Może się tam wszystko sypać jak domki w afganistanie a ty o niczym sie nie dowiesz. Przypuszczam że widziałbyś już tam co się wysypało.
A tak poza tym to debuger w dłoń i klikaj.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2014-12-27 03:04

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0