繁体   English   中英

Java程序在注册侦听器后终止

[英]Java program terminates after registering Listeners

互联网上的大家好!

我的Java代码有问题,我确定这只是一个初学者的错误,但我无法完全理解问题所在。

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Random;

public class MultiThreadChatClient
{
private static Socket clientSocket = null;
private static PrintStream os = null;
private static boolean closed = false;

private static void start() 
{           
    int portNumber = 2222;
    String host = "localhost";

    System.out.println("Host=" + host + ", port=" + portNumber);

    try
    {
        clientSocket = new Socket(host, portNumber);
        os = new PrintStream(clientSocket.getOutputStream());
        os.println("KeyListener ID: " + new Random().nextInt());
    } 
    catch (UnknownHostException e) 
    {
        System.err.println("Finner ikke hosten " + host);
    }
    catch (IOException e) 
    {
        System.err.println("Error, fant ingen åpen server på " + host);
    }

    if ( clientSocket == null || os == null )
    {
        closed = true;
    }
    Listener.startListener();
}

public void stop()
{
    closed = true;
    os.close();
    try
    {
        clientSocket.close();
    }
    catch (IOException e) 
    {
        e.printStackTrace();
    }
}

public static void send(String msg)
{
    if (!closed)
    {
        os.println(msg);
    }
}

public static void main( String[] args )
{
    start();
}
}

和班级:

import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
import org.jnativehook.mouse.NativeMouseEvent;
import org.jnativehook.mouse.NativeMouseInputListener;
import org.jnativehook.mouse.NativeMouseWheelEvent;
import org.jnativehook.mouse.NativeMouseWheelListener;

public class Listener implements NativeKeyListener, NativeMouseInputListener, NativeMouseWheelListener
{
public void nativeKeyPressed(NativeKeyEvent e) 
{   
    MultiThreadChatClient.send(NativeKeyEvent.getKeyText(e.getKeyCode()));
}

public void nativeKeyReleased(NativeKeyEvent e) 
{
}

public void nativeKeyTyped(NativeKeyEvent e)
{
}

public void nativeMouseClicked(NativeMouseEvent e) 
{
}

public void nativeMousePressed(NativeMouseEvent e) 
{
}

public void nativeMouseReleased(NativeMouseEvent e) 
{
}

public void nativeMouseMoved(NativeMouseEvent e)
{
}

public void nativeMouseDragged(NativeMouseEvent e) 
{
}

public void nativeMouseWheelMoved(NativeMouseWheelEvent e)
{
}

public static void startListener()
{
    try 
    {
        GlobalScreen.registerNativeHook();
    }
    catch (NativeHookException ex)
    {
        System.err.println("Et problem oppsto.");
        System.err.println(ex.getMessage());

        System.exit(1);
    }
    Listener listener = new Listener();
    GlobalScreen.getInstance().addNativeKeyListener( listener );
    GlobalScreen.getInstance().addNativeMouseListener( listener );
    GlobalScreen.getInstance().addNativeMouseMotionListener( listener );
    GlobalScreen.getInstance().addNativeMouseWheelListener( listener );
}
}

我的问题是,在将侦听器中注册了关键侦听器之后,程序立即以代码“ 0”终止。

它一直起作用,直到我做了一些事情,现在它才在启动时终止。 我试图启动一个线程只是为了使程序保持活动状态,并且该方法起作用了,但是没有一个侦听器起作用。

先感谢您!

更新:

我尝试了https://code.google.com/p/jnativehook/wiki/examples中的exampleclass,但是事件不再起作用了吗?

与上述问题相同的问题。 我的类(上面的类)和示例calscal都可以正常工作,但是现在它们都只是在注册侦听器后终止(示例类中的main方法)

是我的月食还是这里有什么问题?

如果不运行您的代码,我的猜测是jvm的“ main”线程启动了侦听器,但随后没有阻塞,因此退出了“ main”方法。

您的程序运行并结束。 它结束了,完成了并且完成了。 因此它“停止”。

启动(新)线程将是正确的方法。 但是不要使用线程“使程序保持活动状态”,而是将其用于有用的事情。 在您的情况下,线程可以打开套接字并在该套接字上侦听传入消息(您正在编写聊天客户端,对吗?)。 如果出现消息,则线程将处理它并做出响应。

或者做一个新的线程你的听众的-而不是一个方法startListener ,你可以创建一个名为方法startListenerThread

您的程序流将是:

  • 启动main方法(主线程)
  • 主线程启动套接字线程
  • 主线程启动....(无论如何)
  • 主线程等待,直到所有其他线程都完成(它阻塞)

从Windows Vista开始,Microsoft对SetWindowsHookEx()的工作方式进行了未记录或未记录在案的更改。 基本上,它们为可使用的挂钩数设置了上限,并且还为每个回调设置了处理时间限制。 无法修复,检测或以其他方式解决此新行为。 请让我知道您如何设法使大量的钩子运行,以及您使用的是哪个版本的库。 有关此问题的其他信息,请参见此处

更新:我想回答有关应用程序到达主程序结束后终止方式不一致的原始问题。 在1.2.0 RC1之前,本机线程连接到JVM的方式中存在一些问题,这些问题导致了您在上面描述的问题的一部分。 现在,该本地线程应该作为用户线程(而不是守护程序线程)作为用户线程附加,这将防止应用程序在注册了本地线程后终止。 我相信这是您最初希望从库中获得的行为。

我重新启动计算机后,它又可以工作了。 我的程序无法正常关闭,并作为侦听器卡在内存中。 似乎该程序只有在内存中有大约8个同一应用程序运行时才起作用。 我不知道这是怎么发生的,但是在修复关机程序之后,一切应该都会恢复正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM