【问题标题】:Why does my code stop after a while loop?为什么我的代码在一段时间循环后停止?
【发布时间】:2014-09-16 14:41:21
【问题描述】:

我最近在处理套接字并在它们之间传输数据时,我的程序在循环通过 InputStreamReader#read() 后刚刚停止工作。 我完全不知道为什么会这样,如果有任何帮助,我将不胜感激:)

这是我的代码:

public class SocketClient
{
    public static void main(String[] args)
    {
        String host = "localhost";
        int port = 19999;

        String instr = "";
        System.out.println("SocketClient initialized");

        try
        {
            InetAddress address = InetAddress.getByName(host);
            Socket connection = new Socket(address, port);
            BufferedOutputStream bos = new BufferedOutputStream(connection.getOutputStream());
            OutputStreamWriter osw = new OutputStreamWriter(bos, "US-ASCII");

            String process = "{\"processType\":\"retrieveCoin\",\"uuid\":\"82012e57-6a02-3233-8ee5-63cc5bb52cd1\"}" + (char) 13;

            System.out.println("Querying Data Server: " + process);

            osw.write(process);
            osw.flush();

            System.out.println("Sent data successfully.");

            BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
            System.out.println("bis");

            InputStreamReader isr = new InputStreamReader(bis, "US-ASCII");
            System.out.println("isr");

            int c;

            System.out.println("ic");

            while ((c = isr.read()) != 13)
            {
                System.out.println("iwl " + ((char) c));
                instr += ((char) c);
            }

            System.out.println("awl");

            connection.close();
            System.out.println("Recieved data: " + instr);
        }
        catch (Exception ex)
        {
            System.out.println("Exception: " + ex);
        }
    }
}

在 while 循环结束之前,控制台输出都很好,因为“awl”消息不会打印,或者之后的任何其他内容都不会打印。

套接字的接收端(“服务器”)可以正常接收消息,并正确发送数据(我也在套接字服务器上使用一些调试消息)。

请有人帮助我,我快死在这里了!

【问题讨论】:

  • 所有内容都有一个try-catch,并且OP说没有打印任何内容。
  • 您是否尝试使用调试器单步执行代码?
  • 调试器说什么?看起来您的代码卡在 isr.read() 中,这是阻塞方法。 isr 可以包含除 13 之外的任何内容
  • 不,它不打印任何东西,问题是“awl”甚至没有被打印,这是在while循环结束时,所以connection.close甚至没有被调用。这是控制台输出:SocketClient initialized Querying Data Server: {"processType":"retrieveCoin","uuid":"82012e57-6a02-3233-8ee5-63cc5bb52cd1"} Sent data successfully. bis isr ic iwl 6 iwl 0 iwl 8 iwl 0
  • 不是很好 - 但尝试将 catch Exception 更改为 catch Throwable - 万一它抛出错误

标签: java sockets


【解决方案1】:

据推测,远程端永远不会发送“\r”(或ascii 13)-

while ((c = isr.read()) != 13)
{
  System.out.println("iwl " + ((char) c));
  instr += ((char) c);
}

所以你的循环被阻塞,等待读取的结果。 (您应该检查 -1,即频道结束)。来自Javadoc

读取的字符,如果到达流的末尾则为 -1

而且,-1 不是 13

【讨论】:

  • 非常感谢!删除方实际上并没有发送 \r 这是我的问题,非常感谢! (我不小心把(char) 13的添加注释掉了:)
【解决方案2】:

我很确定您的“服务器”进程不会发送 13 个字符。

你可能想要做的是返回stuff + (char) 13

【讨论】:

  • 我已经通过添加角色解决了问题,请不要发布旧问题!
猜你喜欢
  • 2019-01-10
  • 2010-11-23
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-14
  • 1970-01-01
相关资源
最近更新 更多