为什么我的代码在while循环后停止?

时间:2014-09-16 14:41:22

标签: java sockets

当我的程序在循环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”消息不会打印,或之后的任何其他内容。

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

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

2 个答案:

答案 0 :(得分:4)

据推测,远程方从不发送" \ r" (或ascii 13) -

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

所以你的循环被阻塞,等待读取的结果。 (你应该检查-1,这是通道的结尾)。来自Javadoc

  

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

并且,-1不是13

答案 1 :(得分:1)

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

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