2013-04-25 96 views
0

我試圖讓我的客戶端連接到我的服務器,並根據命令發送一些字符串回客戶端。目前,應用程序連接並可以非常好地向服務器發送字符串。但是,當我發送命令指示服務器發回一些東西時,它會掛起。我發現客戶端嘗試讀取服務器發送的行時會發生此問題。Java readline()保持套接字打開

服務器

PrintWriter out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
      out.println("GETDATA" + "\n");     
      out.flush(); 
      out.close(); 

客戶

BufferedReader fromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));     

     incomingLine = fromServer.readLine(); 
     Log.d("HERE", "NOT " + incomingLine); 
     fromServer.close(); 

謝謝!

回答

1

當我第一次做套接字時,我做了有效的this same mistake

請勿使用PrintWriterBufferedReader。它們不兼容。通過評論,PrintWriter實際上隱藏了重要的例外,所以它們不應該用於網絡。相反,使用DataInputStreamDataOutputStream進行通信。

client = new Socket(hostname, port); 
inStr = new DataInputStream(client.getInputStream()); 
outStr = new DataOutputStream(client.getOutputStream()); 

然後,發送和使用writeUTFreadUTF接受,像這樣:

public void send(String data) throws IOException { 
    outStr.writeUTF(data); outStr.flush(); 
} 

public String recv() throws IOException {return inStr.readUTF();} 

的原因與UTF編碼做; BufferedReader期望某個字符串編碼,PrintWriter不給。因此,讀/寫掛起。

+0

我所做的更改 服務器寫入到客戶端請求後'OUT =新的DataOutputStream類(clientSocket.getOutputStream()); \t out.writeUTF(「This」); \t out.flush(); ' 客戶端讀取什麼發回'DataInputStream inStr = new DataInputStream(clientSocket.getInputStream()); \t \t \t \t incomingLine = inStr.readUTF();' 然而,在讀取,在此情況下在掛起的readUTF(); – Dandrews 2013-04-25 22:44:01

+0

@ user1116969嗯?你只需要說'out = client.getOutputStream()'。但是,是的,這應該工作。 – Zyerah 2013-04-25 22:45:28

+0

它們不是'不兼容'。它們都默認使用平臺字符集,如果*那些*不兼容,則會出現問題。但是,您可以始終使用相同的字符集構建兩者。不過,PrintStream和PrintWriter都會吞下網絡編程中需要了解的異常,因此不應在網絡上使用它們。 – EJP 2013-04-25 22:46:31

0

方法的readLine()預計行字符的結尾「\ n」也許這是你的問題

+1

請在回答中避免小問題 – 2014-05-29 23:48:09