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

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

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