Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的代码在循环一段时间后停止?_Java_Sockets - Fatal编程技术网

Java 为什么我的代码在循环一段时间后停止?

Java 为什么我的代码在循环一段时间后停止?,java,sockets,Java,Sockets,我最近在处理套接字并在它们之间传输数据,当时我的程序在循环通过InputStreamReader\read()后停止工作。 我完全不知道为什么会发生这种情况,我将感谢任何可能的帮助:) 这是我的密码: public class SocketClient { public static void main(String[] args) { String host = "localhost"; int port = 19999; St

我最近在处理套接字并在它们之间传输数据,当时我的程序在循环通过
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”消息,或者在这之后的任何其他消息

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


谁来帮帮我,我快死了

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

因此,您的循环被阻塞,等待读取的结果。(您应该检查-1,它是通道的末尾)。从

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

而且,
-1
不是
13

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


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

所有内容都有一个try-catch,OP说没有打印任何内容。您是否尝试过使用调试器单步执行代码?调试器说了什么?看起来您的代码卡在了
isr.read()
中,这是一种阻塞方法
isr
可能包含除
13
否之外的任何内容。它不会打印任何内容,问题是“awl”甚至不会打印,这是在while循环结束时,因此连接。close甚至不会被调用。以下是控制台输出:
SocketClient初始化查询数据服务器:{“processType”:“retrieveCoin”,“uuid”:“82012e57-6a02-3233-8ee5-63cc5bb52cd1”}已成功发送数据。bis isr ic iwl 6 iwl 0 iwl 8 iwl 0
不太好-但尝试将捕获异常更改为捕获可丢弃-很可能是被丢弃的错误非常感谢!删除端实际上没有发送\r,这是我的问题,非常感谢!(我无意中注释掉了添加的
(char)13
:)我已经通过添加字符解决了问题,请不要发布老问题!
while ((c = isr.read()) != 13)
{
  System.out.println("iwl " + ((char) c));
  instr += ((char) c);
}