Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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 - Fatal编程技术网

java线程无限循环,套接字编程

java线程无限循环,套接字编程,java,Java,我有一个关于线程运行方法中无限循环中套接字输出流刷新机制的问题。我的代码的工作原理是,当客户端套接字向服务器发送消息并在服务器中运行方法时,在“无限循环”中运行,通过readLine()方法接收消息。在无限“while”循环中运行时,在服务器端接收数据工作正常,但当它向客户端发送消息时,如返回确认消息,在使用write()和flush()方法后,它不工作,该方法包含在同一无限“while”循环中 我一直在努力寻找这个问题的解决方案,我发现了一个有趣的假设,当服务器端的无限“while”循环停止运

我有一个关于线程运行方法中无限循环中套接字输出流刷新机制的问题。我的代码的工作原理是,当客户端套接字向服务器发送消息并在服务器中运行方法时,在“无限循环”中运行,通过
readLine()
方法接收消息。在无限“while”循环中运行时,在服务器端接收数据工作正常,但当它向客户端发送消息时,如返回确认消息,在使用
write()
flush()
方法后,它不工作,该方法包含在同一无限“while”循环中

我一直在努力寻找这个问题的解决方案,我发现了一个有趣的假设,当服务器端的无限“while”循环停止运行时,服务器刷新到客户端的所有消息都开始发送到客户端。所以我认为这是队列和线程无限循环的问题,为了安全起见,在无限循环结束之前,线程无限循环不会将消息刷新到另一端。因此,我用线程创建了另一个类,用于向客户端发送服务器消息。它似乎可以工作,因为在刷新消息后,run方法结束。但每次向客户端发送消息时,我都必须创建该类

下面的示例代码使用了与我的原始代码相同的概念,在单独的main方法上运行

客户端:

try {
    // System.out.println("client_working!!") ;

    while (true) {
        writer.write("rkdgusdnr");
        writer.flush();
        // writer.flush();

        System.out.println("client_Working!!");
        sleep(500);
    }

} catch (InterruptedException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

try {
    reader.close();
    writer.close();
    client.close();
    JOptionPane.showMessageDialog(null, "client closed!!");
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
服务器端:

try {
    client = server.accept();

    reader = new BufferedReader(new InputStreamReader(
            client.getInputStream()));
    writer = new BufferedWriter(new OutputStreamWriter(
            client.getOutputStream()));

    String contents = null;

    while (true) {
        // System.out.println("Server_received") ;
        if ((contents = reader.readLine()) != null) {
            System.out.println(contents + "\n");
            writer.write("Server_received");
            writer.flush();
        } else {
            break;
        }
        System.out.println("Server_working!!");
        sleep(500);
    }
} catch (IOException e) {
    e.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
}

try {
    reader.close();
    writer.close();
    client.close();
    server.close();
    JOptionPane.showMessageDialog(null, "server closed!!");
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

你在读台词,但不是在写台词。您需要发送线路终止符。

请向我们展示一些代码,以便我们更好地了解可能出现的错误。是的,我是-uploaded@icedwaterstandardjava套接字是阻塞的,这意味着您需要使用单独的线程进行读写。网上有数以百万计的例子。你的意思是我必须在单独的main()方法上运行服务器和客户端吗?@jtahlbornThank!!就这样。