Program nie chce sie uruchomić

0

Cześć, probuje odpalic program ktory mam na zaliczenie klient-serwer quiz. Mam takie klasy + błąd na końcu. Czy mógłby ktoś pomóc? Z góry dzięki wielkie.

package com.student.lab3;

import java.awt.EventQueue;
import javax.swing.JFrame;

public class AppWindow {

	private JFrame frame;

	 //Stworzenie aplikacji.
	 
	public AppWindow() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	// Uruchomienie aplikacji
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					AppWindow window = new AppWindow();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
}

Klasa Client

package com.student.lab3;

import java.awt.EventQueue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Client {
	
	private Socket _clientSocket;
	private static InetAddress _hostName;
	private static int _tcpPort;
	private JFrame frame;
	private JTextField textField;
	JTextArea textArea;

	/**
	 * Initialize the contents of the frame.
	 */
	
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JMenuBar menuBar = new JMenuBar();
		frame.setJMenuBar(menuBar);
		
		JMenu mnKonfiguracja = new JMenu("Start ");
		menuBar.add(mnKonfiguracja);

		frame.getContentPane().setLayout(null);
		
		JLabel lblNewLabel = new JLabel("Port nasluchu:");
		lblNewLabel.setBounds(10, 0, 91, 24);
		frame.getContentPane().add(lblNewLabel);
		
		textField = new JTextField();
		textField.setBounds(96, 2, 41, 20);
		frame.getContentPane().add(textField);
		textField.setColumns(10);
		
		textArea = new JTextArea();
		textArea.setBounds(0, 169, 424, 72);
		frame.getContentPane().add(textArea);
		
		JScrollPane scrollPane = new JScrollPane(textArea);
		scrollPane.setBounds(10, 169, 414, 72);
		frame.getContentPane().add(scrollPane);
		
		JLabel lblNewLabel_1 = new JLabel("Adres serwera:");
		lblNewLabel_1.setBounds(20, 35, 104, 50);
		frame.getContentPane().add(lblNewLabel_1);
		
	}
	
    public Client(InetAddress hostName, int tcpPort) {
    	initialize();
    	_hostName = hostName;
    	_tcpPort = tcpPort;
    }
    
    public void connect() {
        // tworzymy socket klienta
        try {
			_clientSocket = new Socket(_hostName, _tcpPort);
		} catch (IOException e) {
			//Coś poszło nie tak z połączeniem do serwera
			e.printStackTrace();
		}
        System.out.println("Host " + _hostName + " podłączony do serwera!");
    }

    /**
     * Wysyła wiadomość użytkownika do serwera
     * 
     * @param command
     */
    public void sentUserInput(String command) {
    	String userInput;
    	PrintWriter writer;
    	BufferedReader in;
//    	System.out.println("sui in");
    	//drukujemy
		try {
//			System.out.println("ui try start");
			writer = new PrintWriter(new OutputStreamWriter(_clientSocket.getOutputStream()));
			in = new BufferedReader(new InputStreamReader(System.in));
			System.out.print("Czekam na odpowiedź: ");
			
			if(command == "")
				userInput = in.readLine();
			else
				userInput = command;
			
			writer.write(userInput);
//			System.out.println("ui wr");
	    	writer.println();
	    	writer.flush();
	    	System.out.print("\n");
		} catch (IOException e) {
//			System.out.println("Drukowanie failed");
			e.printStackTrace();
		}
    }
    
    /**
     * Odczytuje odpowiedź z serwera
     * 
     * @param printToConsole
     * @return odpowiedź z serwera
     */
    public String readServerResponse(boolean printToConsole) {
    	BufferedReader in;
    	String serverResponse;
    	String feed;
//    	System.out.println("rsr in");
    	//odbieram odpowiedź z serwera
		try {
//			System.out.println("rsr in try");
			in = new BufferedReader(new InputStreamReader(_clientSocket.getInputStream()));
//			System.out.println("rsr in after try");
		    while ((serverResponse = in.readLine()) != null) {
            	feed = serverResponse.replace("+","\n");
//            	System.out.println("feed:" + feed +"|");
//            	System.out.println("rsr in after try2");	
            	if(printToConsole)
            		System.out.println(feed);
            	
		    	break;
		    }
//		    System.out.println("rsr rtrn: " + serverResponse);
		    return serverResponse;
		} catch (IOException e) {
			serverResponse = "ioexception";
//			System.out.println("Nie udało się odczytać odpowiedzi");
			e.printStackTrace();
		}
		
		return serverResponse;
    }
    
    /**
     * Zamyka socket klienta
     */
    public void close() {
    	System.out.println("Połączenie zamknięte.");
    	//zamykamy wątek klienta
    	try {
			_clientSocket.close();
		} catch (IOException e) {
//			System.out.println("Nie zamknięto połączenia");
			e.printStackTrace();
		}
    }
    
	/**
	 * MAIN
	 * 
	 * @param args
	 */
	public static void main(String args[]) {
		//Tworzę obiekt klienta
		Client client = new Client(_hostName, _tcpPort);
		
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					
					client.frame.setVisible(true);
					
					client.textField.setText(""+Integer.parseInt(args[1]));			
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		
		if (args.length < 2)
			System.out.println("Wprowadź adres serwera TCP oraz numer portu");
		else {
			try {
				_hostName = InetAddress.getByName(args[0]);
				_tcpPort = Integer.parseInt(args[1]);
			} catch (NumberFormatException e) {
				System.err.println("Wprowadź poprawny numer portu: " + e);
				
				return;
			} catch (UnknownHostException e) {
				e.printStackTrace();
				
				return;
			}
			
			try {
				String isKilled;
				//Tworzę obiekt klienta
//				client = new Client(_hostName, _tcpPort);
	            //Łącze się z serwerem
	            client.connect();

				for(int i=0; i<4; i++) {
		            //Initial read server response
		            client.readServerResponse(true);
//		            System.out.println("Po initial rsr");
		            
					//Pytam serwer
//						System.out.println("do sui przed");
		            client.sentUserInput("");
		            
		            //Odczytuje odpowiedź
//			            System.out.println("do rsr przed");
		            isKilled = client.readServerResponse(false);
		            
		            if(isKilled.equals("kill")) {
		            	System.out.println("petla for STOP");
		            	break;
		            }
//		            System.out.println("AMEN");
				}
				client.textArea.append("Test zakończony\n");
	            //Zamykam połączenie
	            client.close();
			} catch (Exception  e) {
				//Inne błędy nie wyłapane przez bloki try w metodach
				e.printStackTrace();
			}
		}
	}
}

package com.student.lab3;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class Jdbc {
	private static Properties connectionProps;
	
	public Jdbc() {
		connectionProps = new Properties();
		connectionProps.put("user", "root");
		connectionProps.put("password", "");
		
		if (ladujSterownik())
			System.out.println("-> sterownik OK");
		else
			System.exit(1);
	}
	
	/**
	 * Metoda ładuje sterownik jdbc
	 * 
	 * @return true/false
	 */
	public static boolean ladujSterownik() {
		// LADOWANIE STEROWNIKA
		System.out.println("Sprawdzanie sterownika:");
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			return true;
		} catch (Exception e) {
			System.out.println("Blad przy ladowaniu sterownika bazy!");
			return false;
		}
	}
 
	/**
	 * Metoda służy do nawiązania połączenia z bazą danych
	 * 
	 * @return połączenie z bazą
	 */
	public static Connection connectToDatabase(String adress, int port, String dataBaseName) {
		System.out.println("Łączenie z bazą danych tcpbaza");
		Connection connection = null;
		try {
			connection = DriverManager.getConnection("jdbc:mysql://" + adress + ":" + port + "/" + dataBaseName, connectionProps);
		} catch (SQLException e) {
			System.out.println("Błąd przy ładowaniu sterownika bazy");
			System.exit(1);
		}
		return connection;
	}
	
 
	/**
	 * Metoda służy do połączenia z MySQL bez wybierania konkretnej bazy
	 * 
	 * @return referencja do uchwytu bazy danych
	 */
	public static Connection getConnection(String adres, int port) {
		Connection connection = null;
		try {
			connection = DriverManager.getConnection("jdbc:mysql://" + adres + ":" + port + "/", connectionProps);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		System.out.println("Połączono z bazą danych!");
		return connection;
	}
	

	public static Statement createStatement(Connection connection) {
		try {
			return connection.createStatement();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		;
		return null;
	}
 
	/**
	 * Zamykanie połączenia z bazą danych
	 * 
	 * @param connection - połączenie z bazą
	 * @param s - obiekt przesyłający zapytanie do bazy
	 */
	public static void closeConnection(Connection connection, Statement s) {
		System.out.println("Zamykanie połączenia z bazą");
		try {
			s.close();
			connection.close();
		} catch (SQLException e) {
			System.out.println("Bląd przy zamykaniu polączenia " + e.toString());
			System.exit(4);
		}
		System.out.println("-> zamknięcie OK");
	}
	
	 
	/**
	 * Metoda służy do wywoływania zapytań do bazy danych
	 * 
	 * @return -1 jeśli operacja się nie powiodła
	 */
	
	public static int executeUpdate(Statement s, String sql) {
		try {
			return s.executeUpdate(sql);
		} catch (SQLException e) {
//			e.printStackTrace();
		} catch (Exception e){
//			System.out.println("ERROR: Wystąpił inny błąd");
//			return -1;
		}
		return -1;
	}
}

package com.student.lab3;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class PrepareDataInDB extends Jdbc {
	Connection connection;
	List<String> questions = new ArrayList<>();
	List<String> goodAnswers = new ArrayList<>();
	
	public PrepareDataInDB() throws SQLException {
		super();
//		Connection connection = connectToDatabase("127.0.0.1","hotel", "root", "root");
		connection = getConnection("localhost", 3306);
		if (connection != null) {
			System.out.println("-> połączenie OK");		
		}
			
		// WYKONYWANIE OPERACJI NA BAZIE DANYCH
		System.out.println("Pobieranie danych z bazy");
		Statement st = createStatement(connection);
		// utworzenie bazy
		if (executeUpdate(st, "CREATE DATABASE tcpBaza;") != -1)
			System.out.println("Baza utworzona");
		else
			System.out.println("Baza nieutworzona! Pewnie istnieje.");
		
		if (executeUpdate(st, "USE tcpBaza;") != -1)
			System.out.println("Baza wybrana");
		else
			System.out.println("Baza niewybrana!");
		
		if (executeUpdate(st, "CREATE TABLE questions(id INT NOT NULL, question VARCHAR(254) NOT NULL);") != -1 &&
				executeUpdate(st, "CREATE TABLE userAnswers(niu INT NOT NULL, questionNr INT NOT NULL, answer VARCHAR(254) NOT NULL);") != -1 &&
				executeUpdate(st, "CREATE TABLE goodAnswers(id INT NOT NULL, answer VARCHAR(254) NOT NULL);") != -1 &&
				executeUpdate(st, "CREATE TABLE userScore(niu INT NOT NULL, score INT NOT NULL);") != -1
				)
			System.out.println("Tabela utworzona!");
		else {
			System.out.println("Tabela nie utworzona! Pewnie istnieje.");
			executeUpdate(st, "TRUNCATE questions;");
			executeUpdate(st, "TRUNCATE goodAnswers;");
		}

		//WRZUCAM DANE DO BAZY
		questions.add("INSERT INTO questions (id, question) VALUES (1, \"Jakie zwierze ma Ala?+1 Psa+2_Kota+3 Warana+4 Surikatke\")");
		goodAnswers.add("INSERT INTO goodanswers (id, answer) VALUES (1, \"2\")");
		questions.add("INSERT INTO questions (id, question) VALUES (2, \"Ile jest miesiecy w roku?+1 10+2 24+3_12+4 30\")");
		goodAnswers.add("INSERT INTO goodanswers (id, answer) VALUES (2, \"3\")");
		questions.add("INSERT INTO questions (id, question) VALUES (3, \"W ktorym roku byla bitwa pod Cedynia?+1_972+2 966+3 1410+4 1610\")");
		goodAnswers.add("INSERT INTO goodanswers (id, answer) VALUES (3, \"1\")");
		questions.add("INSERT INTO questions (id, question) VALUES (4, \"Jaka jest liczba atomowa tlenu?+1 1+2 5+3_8+4 10\")");
		goodAnswers.add("INSERT INTO goodanswers (id, answer) VALUES (4, \"3\")");
		
		for(String query : questions){
			st.executeUpdate(query);
		}
		
		for(String query : goodAnswers){
			st.executeUpdate(query);
		}

		//ZAMYKAM POŁACZENIE
		closeConnection(connection, st);
	}
}

package com.student.lab3;

/**
 * Klasa stosowana jako typ pomocniczy
 */

public class Response {
	private String _userAnswer;
	private boolean _exitTest;
	private int score;
	
	public String getUserAnswer() {
		return _userAnswer;
	}
	
	public void setUserAnswer(String userAnswer) {
		_userAnswer = userAnswer;
	}
	
	public boolean getExitTest() {
		return _exitTest;
	}
	
	public void setExitTest(boolean exitTest) {
		_exitTest = exitTest;
	}

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}
}
package com.student.lab3;

import java.awt.EventQueue;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.SQLException;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

import javax.swing.JFrame;

import com.student.lab3.ServerThread;

import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import javax.swing.JLabel;
import javax.swing.JTextField;

/**
 * Serwer TCP aplikacji
 */
public class Server {
	
	static ServerSocket serverSocket;
	private static int _tcpPort;
	private static int _NIU = 0;
	public static PrepareDataInDB prepareData;
	private JFrame frame;
	private JTextField textField;
	JTextArea textArea;
	
	/**
	 * Create the application.
	 */
	public Server() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JMenuBar menuBar = new JMenuBar();
		frame.setJMenuBar(menuBar);
		
		JMenu mnKonfiguracja = new JMenu("Konfiguracja");
		menuBar.add(mnKonfiguracja);
		
		JMenu mnDodajPytania = new JMenu("Dodaj pytania");
		menuBar.add(mnDodajPytania);
		frame.getContentPane().setLayout(null);
		
		JLabel lblNewLabel = new JLabel("Port nasluchu:");
		lblNewLabel.setBounds(10, 0, 91, 24);
		frame.getContentPane().add(lblNewLabel);
		
		textField = new JTextField();
		textField.setBounds(96, 2, 41, 20);
		frame.getContentPane().add(textField);
		textField.setColumns(10);
		
		textArea = new JTextArea();
		textArea.setBounds(0, 169, 424, 72);
		frame.getContentPane().add(textArea);
		
		JScrollPane scrollPane = new JScrollPane(textArea);
		scrollPane.setBounds(10, 169, 414, 72);
		frame.getContentPane().add(scrollPane);
		
	}
	
    public Server(int tcpPort) {
    	_tcpPort = tcpPort;
    }
	
	public void startServerSide() throws SQLException {
		ExecutorService exec = Executors.newCachedThreadPool();
		Callable<Integer> callable = null;
		
		System.out.println("####### CZĘŚĆ JDBC #######");
		//wrzucam pytania i odpowiedzi do bazy
		prepareData = new PrepareDataInDB();
		System.out.println("####### CZĘŚĆ JDBC #######\n");
		System.out.println("####### CZĘŚĆ TCP #######");
		
        try {
    		//hello world serwerze
            System.out.println("Serwer startuje na porcie " + _tcpPort);
            // tworzę socket serwera
			serverSocket = new ServerSocket(_tcpPort);
		} catch (IOException e) {
			//nie udało się wystartować
			e.printStackTrace();
			return;
		}
        //tworzę socket dla klienta
        Socket client = null;
        
        while(true) {
        	//czekam na zgłoszenie klienta ...
        	System.out.println("Czekam na zgłoszenie usera...");
        	//jest klient, akceptuje...
        	try {
				client = serverSocket.accept();
			} catch (IOException e) {
				//akceptacja nie powiodła się
				e.printStackTrace();
				return;
			}
        	//zaakceptowany, generuje NIU
        	int niu = ++_NIU;
        	System.out.println("[NIU: " + niu + "] Nowy user z adresem IP: " + client.getInetAddress());
        	
        	//klient podłączony, startuje wątek callable
    		callable = new ServerThread(niu, client);
    		
    		try {
	    		exec.execute( new FutureTask<Integer>(callable) {
	    		    public void done() {
	    		      System.out.println("[NIU: " + niu + "] Callable - test zakończony");
	    		    }
	    		});
//    			System.out.println("Wynik testu: " + result + "pkt.");
//   			exec.shutdown();
    		} catch (Exception e) {
//    			e.printStackTrace();
    		}
        }     
    }
	
	/**
	 * MAIN
	 * 
	 * @param args
	 * @throws SQLException 
	 */
	public static void main(String args[]) throws SQLException {
		Server window = new Server();
		
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					
					window.frame.setVisible(true);
					
					window.textField.setText(""+Integer.parseInt(args[0]));
					
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		
		
		if (args.length == 0)
			System.out.println("Wprowadź numer portu, na którym serwer będzie oczekiwał na userów");
		else {
				_tcpPort = 0;
			try {
				_tcpPort = Integer.parseInt(args[0]);
			} catch (NumberFormatException e) {
				System.err.println("Wprowadź poprawny numer portu: " + e);
				return;
			}
			
			//Jeśli powyższe się powiodło, można startować serwer
			try {
				Server server = new Server(_tcpPort);
//				server.startServerSide();
              //zamknięcie strumieni i połączenia jest w kliencie
			} catch (Exception e) {
				System.err.println(e);
				e.printStackTrace();
			}
			
			
			ExecutorService exec = Executors.newCachedThreadPool();
			Callable<Integer> callable = null;
			
			window.textArea.append("####### CZĘŚĆ JDBC #######\n");
//			System.out.println("####### CZĘŚĆ JDBC #######");
			//wrzucam pytania i odpowiedzi do bazy
			prepareData = new PrepareDataInDB();
			window.textArea.append("####### CZĘŚĆ JDBC #######\n\n");
			window.textArea.append("####### CZĘŚĆ TCP #######\n");
			
	        try {
	    		//hello world serwerze
	        	window.textArea.append("Serwer startuje na porcie " + _tcpPort+"\n");
	            // tworzę socket serwera
				serverSocket = new ServerSocket(_tcpPort);
			} catch (IOException e) {
				//nie udało się wystartować
				e.printStackTrace();
				return;
			}
	        //tworzę socket dla klienta
	        Socket client = null;
	        
	        while(true) {
	        	//czekam na zgłoszenie klienta ...
	        	window.textArea.append("Czekam na zgłoszenie usera...\n");
	        	//jest klient, akceptuje...
	        	try {
					client = serverSocket.accept();
				} catch (IOException e) {
					//akceptacja nie powiodła się
					e.printStackTrace();
					return;
				}
	        	//zaakceptowany, generuje NIU
	        	int niu = ++_NIU;
	        	window.textArea.append("[NIU: " + niu + "] Nowy user z adresem IP: " + client.getInetAddress()+"\n");
	        	
	        	//klient podłączony, startuje wątek callable
	    		callable = new ServerThread(niu, client);
	    		
	    		try {
		    		exec.execute( new FutureTask<Integer>(callable) {
		    		    public void done() {
		    		    	window.textArea.append("[NIU: " + niu + "] Callable - test zakończony\n");
		    		    }
		    		});
//	    			System.out.println("Wynik testu: " + result + "pkt.");
//	   			exec.shutdown();
	    		} catch (Exception e) {
//	    			e.printStackTrace();
	    		}
	        }  	
		}
	}
}

package com.student.lab3;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import com.student.lab3.Response;

/**
 * Klasa implementująca interfejs Callable
 * Tworzona w wątku dla podłączonych userów
 */
public class ServerThread implements Callable<Integer> {
	
	private Socket _mySocket;
	private int _NIU;
	List<String> questions = new ArrayList<>();
	List<String> userAnswers = new ArrayList<>();
	List<String> goodAnswers = new ArrayList<>();
	private Connection _connection;
	
	public ServerThread(int niu, Socket socket) {
		super(); // konstruktor
		_mySocket = socket;
		_NIU = niu;
		_connection = Jdbc.connectToDatabase("localhost", 3306,"tcpbaza");
	}
	
	@Override
	public Integer call() { // program wątku
		Response result = null;
		
		try {
//			readQuestions();
			System.out.println("[NIU: " + _NIU + "] Mam nowy wątek " + Thread.currentThread().getName());
			
			do {
				result = doTest();
			} while(result.getExitTest());
		
		} catch (IOException  e) {
			System.err.println(e);
			e.printStackTrace();
		} catch (InterruptedException e) {
	         e.printStackTrace();
	       } catch (SQLException e) {
			e.printStackTrace();
		} finally {
	    	   try {
				_connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}	
		return result.getScore();
	}  
	
	/**
	 * Metoda walidująca odpowiedź usera
	 * Zapisuje odpowiedź do pliku.
	 * 
	 * @param questionNumber
	 * @param answer
	 * @return true jeśli odpowiedź usera była dobra
	 */
	private boolean processAnswer(int questionNumber, String answer)
			throws FileNotFoundException, UnsupportedEncodingException {
//		PrintWriter answers = new PrintWriter("bazaOdpowiedzi.txt", "UTF-8");
//		PrintWriter answers = new PrintWriter(new FileOutputStream(new File("bazaOdpowiedzi.txt"), true));
		Statement st = Jdbc.createStatement(_connection);
		boolean isGoodAnswer = false;
		
//		answers.println("[NIU: " + _NIU + "] Pytanie " + (questionNumber+1) + ": " + answer);
//		if(goodAnswers.get(questionNumber).equals(answer.toString()))
//			isGoodAnswer = true;
//		answers.close();
		
		if (_connection != null) {
			Jdbc.executeUpdate(st, "INSERT INTO useranswers (niu, questionNr, answer) "
					+ "VALUES (" + _NIU + ", " + (questionNumber+1) + ", '" + answer + "');");
			
			try {
				ResultSet rs = st.executeQuery("SELECT answer FROM goodanswers WHERE id = " + (questionNumber+1) + ";");
				if(rs.next()) {
					if(rs.getString(1).equals(answer.toString()))
						isGoodAnswer = true;
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		} else 
			System.out.println("Obsługa odpowiedzi nie powiodła się.");
		
		return isGoodAnswer;
	}
	
	/**
	 * Metoda zapisuje wynik usera w pliku tekstowym
	 * 
	 * @param score
	 */
	private void saveScore(int score) 
			throws FileNotFoundException, UnsupportedEncodingException {
//		PrintWriter results = new PrintWriter("wyniki.txt", "UTF-8");
//		PrintWriter results = new PrintWriter(new FileOutputStream(new File("wyniki.txt"), true));
		Statement st = Jdbc.createStatement(_connection);
		
//		results.println("[NIU: " + _NIU + "] Wynik testu: " + score);
//		results.close();
		
		if (_connection != null) {
			Jdbc.executeUpdate(st, "INSERT INTO userscore (niu, score) " + "VALUES (" + _NIU + ", " + score + ");");
		}
	}
	
	/**
	 * Metoda przeprowadzająca test z userem
	 * 
	 * @return true jeśli test trwa
	 */
	private Response doTest() throws IOException, InterruptedException, SQLException {
		Response response = null;
		int studentScore = 0;
		boolean isGoodAnswer = false;
		
		Statement st = Jdbc.createStatement(_connection);
		ResultSet rs = null;
		
		
		if (_connection != null) {
			try {
				rs = st.executeQuery("SELECT question FROM questions;");
				
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		for(int i=0; i < 4; i++){
			if(rs.next()) {
				createServerResponse(rs.getString(1));
			}
			
//			System.out.println("question " + i + " sent");
			response = readClientResponse();
//			System.out.println("[NIU: " + _NIU + "] Odebrałem odp od usera " + response.getUserAnswer());
			createServerResponse(response.getUserAnswer());
			
			isGoodAnswer = processAnswer(i, response.getUserAnswer());
			if(isGoodAnswer)
				studentScore++;

			if(response.getExitTest() == false)
				break;
			
//			Thread.currentThread();
//			Thread.sleep(1000);
		}
		
		response.setExitTest(false);
		response.setScore(studentScore);
		saveScore(studentScore);
//		System.out.println("[NIU: " + _NIU + "] Zakończono test.");
		
		return response;
	}
	
	/**
	 * Odczyt odpowiedzi od "klienta" TCP
	 * 
	 * @return wiadomość od klienta TCP
	 */
	private Response readClientResponse() throws IOException, InterruptedException {
		Response response = new Response();
		BufferedReader stdIn = new BufferedReader(new InputStreamReader(_mySocket.getInputStream()));
//		System.out.println("enter rcp"); 
		String userInput = stdIn.readLine();
//		String userInput;
//		System.out.println("enter rcp2"); 
//		while ((userInput = stdIn.readLine() ) != null) {
		while (userInput  != null) {
//			System.out.println("enter rcp whi");
			System.out.println("[NIU: " + _NIU + "] Pobrałem odpowiedź od usera " + userInput);
			
			if(userInput.equals("kill")){
//				createServerResponse("kill");
				response.setExitTest(false);
				response.setUserAnswer(userInput);
				System.out.println("[NIU: " + _NIU + "] Żądanie KILL. Przerywam.");
				break;
			} else {
//				createServerResponse(userInput);
				response.setUserAnswer(userInput);
				response.setExitTest(true); 
				break;
			}
		}
		
		return response;	
	}
	
	/**
	 * Metoda wysyła odpowiedź z serwera
	 * 
	 * @param userInput
	 */
	private void createServerResponse(String param) throws IOException, InterruptedException {
		OutputStreamWriter osw = new OutputStreamWriter(_mySocket.getOutputStream());
		PrintWriter writer = new PrintWriter(osw);
		
		if(param.equals("kill")){
			writer.write("kill");
		} else {
			writer.write(param);
		}
//		System.out.println("Odpowiedź z serwera: " + param); 
//		writer.write(param);
		writer.println();
		writer.flush();
	}
}

Wywala taki błąd

Wprowadź numer portu, na którym serwer będzie oczekiwał na userów
java.lang.ArrayIndexOutOfBoundsException: 0
	at com.student.lab3.Server$2.run(Server.java:156)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
1

Wychodzisz poza rozmiar tabilcy

1

W tej linii:

/* Server.java -> main() / linia 156 */
window.textField.setText(""+Integer.parseInt(args[0]));

Wychodzisz poza tablicę, widocznie nie ma żadnych argumentów podawanych do programu.

EDIT:
Przy okazji szybki kurs czytania błędów. W tym co wkleiłeś interesują Cię 2 linie:

java.lang.ArrayIndexOutOfBoundsException: 0
    at com.student.lab3.Server$2.run(Server.java:156)

Pierwsza mówi o tym jaki wyjątek się pojawił, dodatkowo (jeśli się nie mylę) w przypadku ArrayIndexOutOfBoundsException (czyli indeks poza granicami tablicy) podaje on indeks który użytkownik chciał użyć.
Druga linia mówi gdzie ten błąd się pojawił. W nawiasach jest napisana nazwa pliku jak i linia błędu.

0

Z uwag to:

Jdbc.executeUpdate(st, "INSERT INTO useranswers (niu, questionNr, answer) "
                    + "VALUES (" + _NIU + ", " + (questionNumber+1) + ", '" + answer + "');");

Gwarantuje ładne SQL Injection - w tym wypadku żmudne w exploitowaniu, ale jednak.

1

Masz w paru miejscach absurdalne metody main. Wpierw korzystasz z elementów args[0], args[1],.. a dopiero potem sprawdzasz czy one istnieją.

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