1

我有一个读取和写入网络套接字的线程。

public void run() {
    try {
        Socket socket = new Socket("10.0.1.11", 19456);
        out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        String message = "13" + seperator + "0" + seperator + "userdata";
        out.write(message);
        out.flush();

        while (listen) {
            String input = "";

            for (int letter = in.read(); letter != -1; letter = in.read()) {
                System.out.println((char)letter);
                input += (char)letter;
            }

            System.out.println(input);
            displayText(input);
        }

        socket.close();
    } catch (UnknownHostException e) {
        displayText("Could not connect to server!");
    } catch (IOException e) {
        displayText("Could not open IO to server!");
    }
}

但是,for 循环之后的所有内容都不会执行。for 循环内的 System.out.println 打印出它应该打印的所有字母,但是 for 循环后的 System.out.println 和 displayText 函数永远不会执行(用断点检查)......我错过了什么这里?:S

4

2 回答 2

3

根据http://www.docjar.com/docs/api/java/io/Reader.html#read

This method will block until a character is available,
an I/O error occurs, or the end of the stream is reached.

他们的代码示例确实表明他们 -1 在 EOF 上返回。

因此,您的 for 循环被阻塞,因为in.read()无法识别 EOF 条件。

直到套接字服务器关闭其发送方向,它才能做到这一点,这会关闭客户端的接收部分。

于 2012-06-17T14:04:21.823 回答
0
  1. 在调试器中启动程序
  2. 重现错误
  3. 检查线程是否仍然存在(在eclipse中,调试视图列出了所有进程,它们的线程)
    • 如果线程存在:挂起它(在 Eclipse 中,通过单击线程并按下暂停图标)。调试器现在将显示该线程的堆栈,因此您可以检查它在做什么。
    • 如果线程不再存在,则它必须已正常或突然终止(由于未处理的异常)。您可以通过在 run() 中的最后一条语句上设置断点来区分这一点。如果它突然完成,则必须调用线程的未捕获异常处理程序。
于 2012-06-17T14:23:26.603 回答