Query su database con Server

di il
1 risposte

Query su database con Server

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

  • Re: Query su database con Server

    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