2011-11-25 63 views
1

我在寫一個小型客戶端應用程序來與服務器進行通信。我在我的客戶端和服務器之間打開一個套接字,並且可以使用BufferedReader讀取從服務器發出的任何內容。這是在一個線程中讀取。但是,當我使用BufferedReader在套接字上編寫代碼時,沒有任何反應!無異常,但沒有任何服務器響應(和它應該有一個服務器響應) 這裏是我的代碼:BufferedWriter和java中的套接字寫入沒有效果

socketWritter.write(message); 
socketWritter.write("\n"); 
System.out.println(socketWritter.toString()); 
socketWritter.flush(); 

我的插座是正確的開放和萬畝的BufferedWriter正確初始化:

new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) 

我沒有想法爲什麼這不起作用? 任何幫助將是偉大的! Regards

+1

該代碼正確。你可以發佈整個代碼或鏈接(對於較大的文件)? – blackcompe

+0

[鏈接](http://db.tt/9RIqS4wR)這是我寫的代碼。該視圖文件只包含用戶界面的東西。感謝您的幫助 – rmonjo

+0

此問題應該關閉爲'無法重現'。 – EJP

回答

12

您的代碼是正確的。我用一個通用服務器來測試它,它會響應客戶端發送的任何內容,並且它工作正常(沒有更改)。可能是因爲你使用的服務器有問題。我注意到的一件事是,對於我的服務器,每次寫入輸出流時都需要添加一個新行字符,因爲它實際上發送了數據。我敢打賭,這就是爲什麼你的GUI沒有收到任何東西。以下是我的服務器中的客戶端線程類:

class ClientThread extends Thread { 

    private Socket   sock; 
    private InputStream  in; 
    private OutputStream out; 

    ClientThread(Socket sock) { 
     this.sock = sock; 
     try { 
      this.in = sock.getInputStream(); 
      this.out = sock.getOutputStream(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    //Echos whatever the client sends to it 
    public void run() { 
     BufferedReader bufIn = new BufferedReader(new InputStreamReader(in)); 
     BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(out)); 
     while (true) { 
      try { 
       String msg = bufIn.readLine(); 
       System.out.println("Received: " + msg); 
       bufOut.write(msg); 
       bufOut.newLine(); //HERE!!!!!! 
       bufOut.flush(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

} 
+0

問題是,當使用telnet時,服務器響應如例外。我在java中寫入我的套接字的內容與我寫入telnet命令行的內容完全相同。謝謝你的幫助。 – rmonjo

+0

這可能是一個字符串編碼的問題。例如,服務器是UTF-8,我發送給它Ansi(或類似的東西) – rmonjo

+0

再次閱讀您的答案,實際上,我的用戶界面接收一切(使用telnet登錄到服務器時保持活動數據包或信息)。但是當我寫在套接字(不使用telnet)時,服務器就好像它沒有得到任何東西:((( – rmonjo

1

在這一點上,沒有令人信服的證據表明您的客戶端代碼不起作用。特別是,這個聲明:

System.out.println(socketWritter.toString()); 

不會告訴你任何有用的東西。只有Stream對象的toString()方法很可能只會告訴你對象的類名和它的標識哈希碼。它當然不會告訴你你寫到流中的內容。

鑑於這一點,沒有明確的證據表明flush沒有奏效。 (問題可能在服務器端。)

+0

是的,確定toString只是一個絕望的嘗試!它不是來自服務器,因爲使用telnet,正確鍵入在消息變量中發送的內容,服務器響應 – rmonjo