2011-07-25 64 views
0

我知道我昨天發佈了一個問題,可能看起來像我將要呈現給您的那個。然而,由於從前一個問題中汲取教訓,這很可能不一樣。寫入和讀取流中的問題

問題:一個readLine()語句剛好位於並等待輸入。請閱讀:

我有一個與客戶端通信的服務器。使用的數據庫是postgresql。 以下線程用於與客戶端進行通信:

(其中它出錯的部分可能是在for循環)

服務器:

public class mobileComm implements Runnable { 

private Socket sock; 
private Connection connection; 
private BufferedReader br; 

@Override 
public void run() { 
    try { 

     String name = br.readLine(); 
     String password = br.readLine(); 
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(), "UTF8")); 

     if (methods.checkContinue(name, password)) { 
      methods.log(name + password); 
      connection = methods.connectToDatabase(); 

      if (connection != null) { 
       String getQuery = 
         "SELECT name, password, updatetext FROM accounts " 
         + "WHERE name = ? AND password= ?"; 
       String setQuery = 
         "UPDATE accounts SET doupdate = 'yes' " 
         + "WHERE name = ?'"; 
       PreparedStatement getPS = connection.prepareStatement(getQuery); 
       PreparedStatement setPS = connection.prepareStatement(setQuery); 
       getPS.setString(1, name); 
       getPS.setString(2, password); 
       ResultSet rs = getPS.executeQuery(); 
       if (rs.next() && rs.isLast()) { 

        boolean success = false; 

        bw.write("accept\n"); 
        bw.flush(); 
        setPS.setString(1, name); 
        setPS.executeUpdate(); 

        String currentText = rs.getString("updatetext"); 
        String updatedText; 

        for (int i = 0; i < 10; i++) { 
         if (!(updatedText = getPS.executeQuery().getString("updatetext")).equals(currentText)) { 
          bw.write("update\n"); 
          bw.flush(); 
          bw.write(updatedText + "\n"); 
          bw.flush(); 
          success = true; 
          break; 
         } 
         try { 
          Thread.sleep(250); 
         } catch (InterruptedException ex) { 
         } 
        } 

        if (!success) { 
         bw.write("noupdate\n"); 
         bw.flush(); 
        } 

       } else { 
        bw.write("decline\n"); 
        bw.flush(); 
       } 
       rs.close(); 
       getPS.close(); 
       setPS.close(); 
      } 
     } else { 
      bw.write("wrong\n"); 
      bw.flush(); 
     } 

     bw.close(); 
     br.close(); 

    } catch (IOException ex) { 
     methods.log("Failed when creating brs and writers in mobileComm"); 
    } catch (SQLException ex) { 
     methods.log("Error with sql in mobileComm thread"); 
    } 
} 

public mobileComm(Socket sock, BufferedReader br) { 
    this.sock = sock; 
    this.br = br; 
} 
} 

代碼對於連接的客戶端看起來像這樣:

 try { 

     String line; 
     Socket sock = new Socket("83.205.36.66", 80); 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(), "UTF8")); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF8")); 

     writer.write("request\n"); 
     writer.write(jTextField1.getText() + "\n"); 
     writer.write(jTextField2.getText() + "\n"); 
     writer.flush(); 
     if ((line = reader.readLine()).equals("accept")) { 
      System.out.print(line); 
      jTextArea1.setText("Waiting for script to send data."); 
      if ((line = reader.readLine()) != null) { 
       if (line.equals("update")) { 
        Scanner s = new Scanner(reader.readLine()).useDelimiter("\\s*::\\s*"); 
        ArrayList<String> items = null; 
        while (s.hasNext()) { 
         items.add(s.next()); 
        } 
        for (int i = 0; i < items.size(); i++) { 
         jTextArea1.setText(""); 
         jTextArea1.append(items.get(i) + "\n"); 
        } 
       } else if (line == "noupdate") { 
        jTextArea1.setText("No script running."); 
       } 
      } else { 
       jTextArea1.setText("Line is null"); 
      } 

     } else if (line.equals("decline")) { 
      jTextArea1.setText("Incorrect user/pass combination"); 
     } else if (line.equals("wrong")) { 
      jTextArea1.setText("Certain characters/strings were not allowed"); 
     } 
     reader.close(); 
     writer.close(); 
    } catch (IOException e) { 
     jTextArea1.append("Server not available. Please try again later."); 
    } 

實際問題發生在

  if ((line = reader.readLine()) != null) { 

布爾檢查。客戶端應用程序的GUI只是凍結,就像等待輸入一樣。

的在服務器線程循環,是因爲它等待新的數據庫,輸入從另一個線程

我刪除了整個for循環,只是寫了

bw.write("update\n); 
bw.flush(); 
bw.bw.write("this::is::a::test\n); 
bw.flush(); 

相反。 readLine()仍然使應用程序凍結,就像它正在等待輸入一樣。

那麼爲什麼readLine()「不會執行」呢?

另外,jTextArea1文本不會更改爲「等待腳本發送數據」。正如它應該。

只要問你是否想知道任何事情。

備註: 在客戶端應用程序中不會引發異常。 客戶端應用程序打印出接受,表明它在我第一次詢問時讀取一行。

任何幫助表示讚賞。真的,任何幫助。

Mike。

+0

任何人都不可能回答你的問題,因爲你沒有努力提供[Short Self Contained Correct Example](http://pscode.org/sscce.html) – Bohemian

+0

我意識到這是讓人去tl;博士,但我真的沒有看到任何其他方式來制定它。:/ –

+0

現在更新了問題。希望它更直接 –

回答

1

修正:從數據庫中讀取數據時

從來沒有所謂的next()在for循環中,因此從來沒有真正從數據庫中讀取任何東西。