当前位置: 首页 > 知识库问答 >
问题:

进程挂起我的应用程序

阎英朗
2023-03-14

我正在做一个大学作业,我必须午餐3个服务器处理客户和一个服务器组的领导,这里是场景:

  1. 领导者开始。
  2. leader 运行 3 台服务器(必须使用 Runtime.getRuntime().exec() 将它们作为 jar 文件运行);
  3. 向服务器发送激活消息以开始为客户端提供服务
  4. 客户端开始与服务器通信。

问题是在客户端发出3或4个请求后,服务器挂起,只有当领导者终止时才完成其工作。如果我从cmd手动运行jar文件,一切正常,只有当领导者通过进程午餐jar文件时,问题才会出现。

下面是一些代码 - 服务器主节点,它接受来自组的领导者或要服务的客户端的任何新连接:

public void startServer () throws IOException{
        //new LogSetup ( "logs/server/server.log" , Level.ALL );
        this.serverStatus = ServerStatuses.UNDER_INITIALIZATION;
        running = initializeServer ();
        if ( serverSocket != null ) {
            while ( isRunning () ) {
                try {
                    Socket client = serverSocket.accept ();
                    ConnectionThread connection = new ConnectionThread (
                            client , this );
                    new Thread ( connection ).start ();

                    logger.info ( "new Connection: Connected to "
                            + client.getInetAddress ().getHostName ()
                            + " on port " + client.getPort () );
                } catch ( IOException e ) {
                    logger.error ( "Error! "
                            + "Unable to establish connection. \n" , e );
                }
            }
        }
        logger.info ( "Server stopped." );
    }

用于新连接的线程:

public void run () {
        try {
            output = clientSocket.getOutputStream ();
            input = clientSocket.getInputStream ();

            while ( isOpen ) {
                try {
                    AbstractMessage msg = receiveMessage ();
                    handleRequest ( msg ); // to determine the connection type
                    /*
                     * connection either terminated by the client or lost due to
                     * network problems
                     */
                } catch ( IOException ioe ) {
                    logger.error ( "Error! Connection lost!" +ioe.getStackTrace ());
                    isOpen = false;
                }
            }

        } catch ( IOException ioe ) {
            logger.error ( "Error! Connection could not be established!" , ioe );

        } finally {

            try {
                if ( clientSocket != null ) {
                    input.close ();
                    output.close ();
                    clientSocket.close ();
                }
            } catch ( IOException ioe ) {
                logger.error ( "Error! Unable to tear down connection!" , ioe );
            }
        }
        logger.info ( "exit the thread" );
    }
private void handleRequest ( AbstractMessage msg ) throws IOException {
        logger.info ( "inside handling abstract message" );
        if ( msg.getMessageType ().equals ( MessageType.CLIENT_MESSAGE ) ) {
            handleClientRequest ( ( ClientMessage ) msg );
        } else if ( msg.getMessageType ().equals ( MessageType.SERVER_MESSAGE ) ) {
            handleServerRequest ( ( ServerMessage ) msg );
        } else if ( msg.getMessageType ().equals ( MessageType.ECS_MESSAGE ) ) {
            handleECSRequest ( ( ECSMessage ) msg );
        }
        logger.info ( "finish handling " );

    }

共有1个答案

慕容星晖
2023-03-14

领导流程必须处理来自服务器的输入/输出/错误。当服务器记录某个内容时,它会写入System。out(这是大多数日志框架的默认行为)。由于您的领导启动了服务器进程,因此输出将写入管道。如果管道缓冲区已满,日志将阻塞,服务器将“挂起”。

 类似资料:
  • 问题内容: Python版本:2.6.7 我在for循环中有以下subprocess.call,该循环被执行18次,但是,该过程始终挂在第19个循环上: 控制台输出如下所示: 由于我对python脚本不是很熟悉,所以我只是在徘徊我是否在做错什么…我怀疑某个地方出现了死锁。 会处理这些问题吗? 在什么情况下subprocess.call会挂起任何专家答案?非常感谢 问题答案: 当使用子过程时,我倾向

  • 问题内容: 我尝试完成的任务是流式处理ruby文件并打印输出。(注意:我不想一次打印出所有内容) main.py puts “hello” 问题 流文件工作正常。打招呼/再见输出将延迟2秒打印。就像脚本应该工作一样。问题是readline()最终挂起并且永不退出。我从来没有达到最后的打印。 我知道这里有很多类似的问题,但是这些都不是让我解决问题的方法。我并不是整个子流程中的人,所以请给我一个更实际

  • 问题内容: 首先了解应用程序的一些背景知识。我有一个应用程序通过线程池并行处理许多独立的任务。现在线程池正在挂起。 以下是我的线程转储的摘录,我的pool-2中的所有线程都被“ pool-2-thread-78”阻止了。尝试写入控制台似乎已锁定,我觉得这很奇怪。谁能为我说明情况? 编辑 :平台详细信息Java版本“ 1.6.0_07” Java(TM)SE运行时环境(内部版本1.6.0_07-b0

  • 问题内容: 我正在用javaFx编写天气应用程序,以从openweather.org获取数据。从openweather获取JSON的整个代码运行良好,也可以将JSON数据转换为对象。我用lambda表达式来实现在。问题是:如果我运行Main class,请按按钮,该应用程序将挂起。导入数据的线程有效(在控制台上通过2次打印检查),主线程“跳过” 并在控制台上打印某些内容。我不确定这里出什么问题了。

  • 问题内容: 我一直在尝试使用Java的ProcessBuilder在Linux中启动应“长期”运行的应用程序。该程序的运行方式是启动命令(在本例中,我正在启动媒体播放应用程序),允许其运行并检查以确保它没有崩溃。例如,检查PID是否仍处于活动状态,然后重新启动该进程(如果已终止)。 我现在遇到的问题是PID在系统中仍然有效,但是应用程序的GUI挂起了。我尝试将ProcessBuilder(cmd)

  • 我正在使用在线程上运行的 SurfaceView 类中的画布。SurfaceView 由 Activity (setContentView(surfaceview)) 调用。当屏幕关闭时,它会通过一个 pause() 方法关闭所有循环变量等。 奇怪的是:虽然在我的平板电脑(Android 4.4.2)线程暂停和恢复正确(线程重新开始),但是在我的手机(Android 4.2.2)和其他人的手机(C