2013-10-06 33 views
-1

我有2個程序:一個客戶端和一個服務器。BufferedReader readLine和OutputStreamWriter .write

服務器創建一個ServerSocket和客戶端使用:

address = InetAddress.getByName(host); 
conn = new Socket(address, port); 

這個工作,但現在的問題是:一旦點擊鼠標時void mousePressed() {被調用,執行這樣的:(客戶端)

void mousePressed() { 
    try { 
    BufferedOutputStream os = new BufferedOutputStream(conn.getOutputStream()); 
    OutputStreamWriter osw = new OutputStreamWriter(os, "US-ASCII"); 
    osw.write("123"); 
     osw.flush(); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
} 

服務器應該使用接收輸入:

BufferedReader reader = new BufferedReader(
new InputStreamReader(new BufferedInputStream(conn.getInputStream()))); 
StringBuilder result = new StringBuilder(); 
for (String line = null; (line = reader.readLine()) != null;) { 
    result.append(line); 
} 
reader.close(); 
println(result.toString()); 

服務器僅在套接字關閉後才接收輸入:客戶端上的conn.close();或退出客戶端。由於我想多次點擊鼠標,我無法關閉套接字。

如何在不關閉套接字的情況下發送輸入信息?

編輯:連接代碼:

服務器:

// init 
    ServerSocket socket1; 
    int main_port = 5204; 
    // in main 
    try { 
      socket1 = new ServerSocket(main_port); 
      Socket conn = socket1.accept(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

客戶:

// init 
    String host = "localhost"; 
    int port = 5204; 
    Socket conn; 
    InetAddress address; 
    // in main 
    try { 
      address = InetAddress.getByName(host); 
      conn = new Socket(address, port); 
     } catch (Exception e) { 
       e.printStackTrace(); 
      } 
+1

另外,**永遠不會**異常.'catch(Exception e){}'什麼都不做! –

+0

提示的名稱是'readLine()'。它讀取一行文字,而你沒有發送。嘗試發送一個換行符,即'\ n' –

+1

@ShashankKadne更糟糕的是它會拋出您可能需要知道的錯誤,尤其是如果您的軟件無法正常工作。 –

回答

1

我的解決方案(基於其他的答案和註釋):

1)在客戶端更改osw.write("123");osw.write("123\n");

2)更換

BufferedReader reader = new BufferedReader(new InputStreamReader(new 
BufferedInputStream(thread_cnn.getInputStream())));   
     StringBuilder result = new StringBuilder(); 
     for (String line = null; (line = reader.readLine()) != null;) { 
    result.append(line); 
} 
println(result); 
reader.close(); 

BufferedReader reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(conn.getInputStream())));   
String result = reader.readLine().toString(); 
println(result); 
reader = null; 
result = null; 

在服務器上。

0

你正在編寫一個不完整的線,並嘗試讀取完整的生產線。用換行符終止發送的文本,以便在到達時讀取它。

另外,不要忽略和忽略異常。如果出現問題,你會想知道它。

try { 
    BufferedOutputStream os = new BufferedOutputStream(conn.getOutputStream()); 
    OutputStreamWriter osw = new OutputStreamWriter(os, "US-ASCII"); 
    osw.write("123\n"); 
    osw.flush(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
+0

,使服務器進入for循環一次,但它仍然不輸出'result.toString()',直到客戶端關閉套接字。 – Laurent

+0

這是因爲服務器有一個循環嘗試讀取客戶端發送的所有內容,直到客戶端關閉套接字爲止。如果你不希望發生這種情況,請刪除循環。 – Joni

相關問題