Query su database con Server

di Anonimizzato6881 il
1 risposte
Salve a tutti, ho appena iniziato a creare un'applicazione client/server in java per l'esame di programmazione III..

In pratica il client deve passare una query al server che la deve eseguire sul database (creato in locale) e passare il risultato al client che a sua volta lo deve stampare.

Il codice del server è questo:
package bloodyworld_server;

//Importo i package
import java.net.*;
import java.io.*;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

//Creazione di una classe per il Multithreading
class ServerThread extends Thread
{
     private Socket socket;
     private Connection con;
     
     public ServerThread (Socket socket, Connection con) 
     {
         this.socket = socket;
         this.con=con;
     }

     //esecuzione del Thread sul Socket (l'operazione vera e propria Client-Server)
    @Override
     public void run() 
     {
         try 
         {                                           
                Statement st = null;
                ResultSet rs = null;
                DataInputStream is = new DataInputStream(socket.getInputStream());
                DataOutputStream os = new DataOutputStream(socket.getOutputStream());
                String name = null;
                while(true) 
                {
                    String userInput = is.readLine(); //leggo la query inviata dal client
                    
                    if (userInput == null || userInput.equals("QUIT")) break;
                    
                    try 
                    {
                        st = con.createStatement();
                    } catch (SQLException ex) {Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);}
                    
                    try
                    {
                        rs = st.executeQuery(userInput);
                        //os.writeBytes("Ciao Client!\n");//risposta del server al client
                        //System.out.println("Il Client ha scritto: " + userInput);
                    } catch (SQLException ex) {Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);}
                 
                    try 
                    {
                        name = rs.getString("Name");
                    } catch (SQLException ex) {Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);}
                    
                    os.writeBytes(name);
                }
                
                os.close();
                is.close();
                
                socket.close();
         }
         catch (IOException e) 
         {
             System.out.println("IOException: " + e);
         }
     }
}

//Classe Server per attivare la Socket
public class Bloodyworld_server 
{
     public void start() throws Exception 
     {
         Connection con = null;
         try
         {
            Class.forName("com.mysql.jdbc.Driver");
            String connectionUrl = "jdbc:mysql://localhost/bloodyworld";
            String user = "root";
            String password = "antonio";
            con = DriverManager.getConnection(connectionUrl,user,password);
            System.out.println("Connessione al Database Riuscita");
         } 
         catch (SQLException e) 
         {
            System.out.println("Accesso Negato: "+ e.toString());
         } 
         catch (ClassNotFoundException cE) 
         {
            System.out.println("Class Not Found Exception: "+ cE.toString());
         }
         
         ServerSocket serverSocket = new ServerSocket(7777);

         //Ciclo infinito di ascolto dei Client
         while(true) 
         {
             Socket socket = serverSocket.accept();
             ServerThread serverThread = new ServerThread(socket,con);
             serverThread.start();
         }
     }

     public static void main (String[] args)  
             throws Exception 
             {
                Bloodyworld_server tcpServer = new Bloodyworld_server();
                tcpServer.start();
             }
}
Il client è questo:
package bloodyworld_client;

/**
 *
 * @author antonio
 */
import java.io.*;
import java.net.*;


public class Bloodyworld_client
{
    public static void main(String argv[])
    {
        BufferedReader in = null;
        PrintStream out = null;
        Socket socket = null;
        String message;
        try
        {
            // open a socket connection
            socket = new Socket("localhost", 7777);
            // Apre i canali I/O
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintStream(socket.getOutputStream(), true);
            out.println("SELECT Name FROM item WHERE Type='Attacco'");
            // Legge dal server
            message = in.readLine();
            System.out.print("Il Server ha eseguito la query ed ha risposto: " + message+"\n");
            out.close();
            in.close();
        }
        catch(Exception e) { System.out.println(e.getMessage());}
    }
}
L'errore che mi restituisce è questo
dic 09, 2012 4:30:26 PM bloodyworld_server.ServerThread run
SEVERE: null
java.sql.SQLException: Before start of result set
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
	at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
	at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5650)
	at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570)
	at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5610)
	at bloodyworld_server.ServerThread.run(Bloodyworld_server.java:79)

Exception in thread "Thread-0" java.lang.NullPointerException
	at java.io.DataOutputStream.writeBytes(DataOutputStream.java:274)
	at bloodyworld_server.ServerThread.run(Bloodyworld_server.java:82)
BUILD STOPPED (total time: 27 seconds)
La connessione al database sembra funzionare così come il passaggio della query via socket.. L'errore sta quando eseguo la query ma non riesco a capire il perchè.. E' la prima volta che scrivo un programma del genere quindi sono molto inesperto..

Grazie per eventuali consigli.

1 Risposte

  • Leggendo il codice ho visto che non leggi in modo corretto l'oggetto ResultSet. Dovresti richiamare il metodo "next()" per leggere la prima riga del resultset. Prova, ciao...
Devi accedere o registrarti per scrivere nel forum
1 risposte