簡體   English   中英

BufferedReader readLine方法掛起並阻止程序

[英]BufferedReader readLine method hangs and block program

我正在嘗試使用Java學習套接字,並且我成功地將數據發送到在我自己的機器上運行的ServerSocket。 當我嘗試使用readline從這個套接字讀取時(所以我可以回顯我自己發送的消息)我的程序掛起並且不會返回。

這是代碼:

public static void main(String[] args) throws UnknownHostException, IOException {

    TCPClient cli = new TCPClient("127.0.0.1", "15000");
    try {
        cli.ostream.writeUTF("Teste");
        String echo = cli.istream.readLine(); //it hangs in this line
        System.out.println(echo);
    }

TCPClient是我定義的類,所以我可以在我的homwework上使用swing之前在更簡單的界面上測試我的程序。 這是代碼:

public class TCPClient {

public DataOutputStream ostream = null;
public BufferedReader istream = null;

public TCPClient(String host, String port) throws UnknownHostException {
    InetAddress ip = InetAddress.getByName(host);

    try {
        Socket socket = new Socket(host, Integer.parseInt(port));

        ostream = new DataOutputStream(socket.getOutputStream());
        istream = new BufferedReader(new InputStreamReader(socket.getInputStream()));


    } catch (IOException ex) {
        Logger.getLogger(TCPClient.class.getName()).log(Level.SEVERE, null, ex);
    }

}

我的服務器非常簡單。 建立連接后,它進入此循環並保持在此直到我關閉客戶端(因為無限循環)。 之后,一些異常處理將其返回到連接開始之前的點。

            while(true){
                String msg = istream.readLine();
                System.out.println("Arrived on server: " + msg); //just works on debug
                ostream.writeUTF("ACK: " + msg);
                ostream.flush();
            }

我不知道我錯過了什么。

PS:奇怪的是,如果我調試服務器,我可以看到消息到達那里(例如我可以打印它),但如果我只運行此代碼,這是不可能的。 這是否有一些我忽略的並發關系?

謝謝

問題是readLine嘗試讀取一行。 在確定已到達行尾之前,它不會返回該行。 這意味着它需要換行符或通信結束。 由於服務器不發送任何換行符並且不關閉流,因此客戶端將無限期地等待。

cli.ostream.writeUTF("Teste");

這不應該包含新的一行嗎? 否則read方法將等待我想的新行。

同樣如建議您可以在寫入后嘗試刷新ostream。

writeUTF()不寫一行。 見Javadoc。 writeUTF()用於readUTF()。 讀者可以和作家一起使用。 因此,將DataOutputStream更改為BufferedWriter並調用write(),然后調用newline()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM