私は、クライアントがクエリを送信し、サーバーが結果を取得し、それをクライアントに送り返しJavaアプリケーションを書いています
コードは以下の通りであります:
private ServerSocket serverSocket;
private Socket socket;
private BufferedReader bufferedReader;
private PrintWriter printWriter;
private String message;
private Connection connection; //rappresenta la connessione col database
private ResultSet resultSet; //rappresenta i risultati della query
private Statement stmt; //rappresenta la query
public ServerSql() throws IOException, ClassNotFoundException, SQLException {
serverSocket = new ServerSocket(5000);
Class.forName("com.mysql.cj.jdbc.Driver");
//connessione al database
connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","");
}
@Override
public void run() {
try {
while(true){
socket = serverSocket.accept();
printWriter = new PrintWriter(socket.getOutputStream(),true);
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
message = bufferedReader.readLine();
stmt = (Statement) connection.createStatement();
resultSet = stmt.executeQuery(message);
while (resultSet.next()) {
String id = resultSet.getString(1);
String nome = resultSet.getString(2);
String cognome = resultSet.getString(3);
String result = id + nome + cognome;
printWriter.println(result);
}
}
} catch (IOException | SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws SQLException, IOException, ClassNotFoundException {
new Thread(new ServerSql()).start();
}
}
public class SqlClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",5000);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);;
String message;
Connection connection;
ResultSet resultSet;
Statement stmt;
Scanner scanner = new Scanner(System.in);
message = scanner.nextLine();
printWriter.println(message);
System.out.println(bufferedReader.readLine());
printWriter.flush();
printWriter.close();
bufferedReader.close();
}
}
あなたは、私は3つの変数の各行のすべての3つの列を保存するサーバーのコードで見ることができるように、文字列を作り、それをクライアントに送信され、それが動作しますが、私はAでのreadlineを入れた場合、クライアントは、1つの文字列のみを受け取りますそれを停止する際にループがどのように私は知っていますか?それはいつも聞いていますので、私はスレッドを作るべきか?私は最初、私は結果セットをシリアル化したい時に、これを行うための最善の方法だったかと思ったが、それはSerializableを実装していません。だから私は、二次元配列を使用する必要がありますか?そうならば、それの場所ですべてのレコードを置くためのコードは何ですか?
私はどこでも検索が、私はこの、してください助けを行うための正しい方法であるかを理解することはできません。
どのようにあなたについて、サーバーから結果セットを反復処理し、リストに保存し、[文字列としてリストをjsonifyし、クライアントに送信します。クライアントは再びリストにJSON文字列に変換することができます。JSON形式の変換に利用することができ、いくつかのライブラリがあります。
あなたはJSONのアイデアのようにしない場合、あなたはまた、他の既存のデータ型を試すことができます。またはちょうどあなたのクライアントとサーバは、Javaの両方であるとして、シリアライズを実装する独自のデータ型を作成します。
あなたのデータ量が大きい場合は、バッチ当たり例10000のために、一度に送信する方法多くのレコードにサーバー側で制御することができます。各10000、あなたはJSON文字列としてデータを送信します。そして、あなたのクライアントは、例えば、あなたがサーバから文字列を受け取り、それは全体のセッションの最後として、サーバーから何かを読み取るまで、リスニングを維持するために持っている:「終了」した後、あなたは、読み取りを停止します。
あなたは、サーバーから行ずつを読みたい場合は、あなたのケースで、サーバーが「BYE」を送信するまでのループは、読み続けることができます。そして、あなたのサーバーは、あなたの結果セットを送信するそして最後に「さようなら」送信することができます
while(true){
String receiveMessage = bufferedReader.readLine();//receive from server
if(receiveMessage.equals("bye"))
break;
System.out.println(receiveMessage);
}