我正在用Java寫一個客戶端 - 服務器桌面應用程序。我寫了一個運行的服務器(打開套接字)&等待客戶端連接。客戶端不直接與數據庫(MySQL)通信,他們向服務器發送查詢,服務器執行查詢&將結果集轉換爲JSON &將其發送回客戶端。 在客戶端我寫一個Listener類:訪問從服務器到客戶端以外的傳遞值可運行線程類
private class Listner implements Runnable {
private Thread t;
private final Socket socket;
private BufferedReader input;
Listner(Socket s) {
socket = s;
}
@Override
public void run() {
while (true) {
try {
String message;
message = input.readLine();
sharedInputFromServer = input.readLine();
System.out.println("message value in run(): " + message);
} catch (IOException e) {
}
try {
Thread.sleep(30);
} catch (InterruptedException ex) {
Logger.getLogger(ClientDashboard.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void start() {
try {
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("input value in start() :" + input);
} catch (IOException e) {
e.printStackTrace();
}
if (t == null) {
t = new Thread (this, "client");
t.start();
}
}
}
在客戶機GUI使用返回的數據,我限定的可變
public String sharedInputFromServer;
和用於測試我設置的actionPerformed一個按鈕來更新標籤有返回值
private void btn_sendToServerActionPerformed(java.awt.event.ActionEvent evt) {
if (null != output) {
String textToSend = "SELECT unit_id, unit_name FROM units;";
output.println(textToSend);
System.out.println("got the share: " + sharedInputFromServer);
lbl_clientStatus.setText(sharedInputFromServer);
}
當我點擊鏈接首次sharedInputFromServer返回null,第二次它再次返回空值(消息在運行()取值)&當我第三次點擊按鈕時,它返回所需的值。
- 爲什麼它一開始不工作?
- 這是正確的&從服務器接收查詢結果的正確方法&在客戶端上使用它嗎?
其他問題:我會避免將Thread對象**放入** Runnable中。讓調用代碼成爲啓動並控制線程對象本身的代碼。 –
請參閱編輯 –
.......... hello? –