【问题标题】:Java chatprogram, infinit loop stopsJava聊天程序,无限循环停止
【发布时间】:2014-05-03 22:18:51
【问题描述】:

我必须建立一个聊天程序。 有服务器类、客户端类和两个线程来编写和接收消息。 这两个线程应该在一个无限循环中运行,并一直检查是否有输入并在之后打印该输入。

但我的程序只运行一轮。所以服务器和客户端可以写一条消息,然后它停止并且不检查另一条消息。当线程从不中断时,为什么线程不会从头开始重新启动? --> 看下面的代码 我希望你知道我的问题是什么,我很难描述。

阅读新消息的线程

public class MsgWriter extends Thread  {

    private Socket s;

    public MsgWriter(Socket s){
        this.s = s;
    }
    public void run(){
        int i = 0;
    OutputStream out = null;
    PrintWriter writer;
    Scanner input;
    while(!interrupted()){
        try{
        synchronized(s){

        input = new Scanner (System.in);

            out = s.getOutputStream();

         writer = new PrintWriter(out);
         String toserver = input.nextLine();
         writer.write(toserver);
         writer.flush();
         System.out.println("me: " + toserver);

        }
         try {
            Thread.sleep((int) (100 * Math.random()));
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        }catch(Exception e) {
        }

    }
    }
}

线程检查是否有新消息并打印。

public class MsgReader extends Thread {


    Socket s;

    public MsgReader(Socket s){
        this.s = s;

    }


    public void run()  {
        int i = 0;
    while (!interrupted()) {
        try{
        synchronized(s){

        InputStream in = s.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));

        String s = null;
        while((s=reader.readLine()) != null){
            System.out.println("d");
        }
        }
        try {
            Thread.sleep((int) (100 * 1));
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }catch (Exception e){

        }
        }

    }

    }

Server 类启动一个新的服务器并等待一个客户端,然后它启动两个线程。与客户端类相同,它连接到服务器并启动线程。

【问题讨论】:

  • interrupted() 方法在做什么?
  • 只是为了检查线程是否应该继续工作我认为。我猜 thread.interrupted() 与 thread.stop() 相同(只需在论坛中阅读它以使用 if 线程中的循环)
  • 调试提示:要么使用调试器单步调试它,要么在其中穿插打印语句以找出它在哪里中断或挂起。
  • 调试是一项有用的技能。如果您有更多信息,我可以尝试为您提供更多帮助,但事实上,这是我能做的最多的事情了。
  • 非常感谢,我想我能找到打印方法的问题。我不得不承认,我是一个初学者,从未使用过调试器。我想我的问题不是很清楚,不是吗?我有点困惑,为什么已经有 3 个人对我的帖子投了反对票。

标签: java multithreading chat


【解决方案1】:

您可能在某处抛出异常。在你的 catch 块中,打印错误。

try {

} catch (Exception e) {
    System.out.println("Error: " + e);
}

【讨论】:

  • 我在每个 catch 块中复制了代码,但没有错误消息。它只打印一次消息 f.e.我:那是一条消息,然后停止。
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2020-01-22
  • 1970-01-01
  • 2023-01-13
相关资源
最近更新 更多