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.