<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 41,  comments - 40,  trackbacks - 0

    前幾天自己發表的只運行一個實例的文章,感謝Pande的留意,并提出寶貴意見,他推薦的正好是我想找的RSSOwl源碼,以下是我分析RSSOwl如何做到只運行一個實例并且激活的,如有錯誤,請拍磚。

    http://sourceforge.krugle.com/kse/files/cvs/cvs.sourceforge.net/rssowl/RSSOwl/src/java/net/sourceforge/rssowl/controller/RSSOwlLoader.java

    根據 RSSOwlLoader.java 中的

    [code]
    private static void startupProcess( String[] args )
    {
    ? ...

    ? if( !System.getProperties().containsKey( PROPERTY_ALLOW_MULTI_INSTANCES )&&StartupManager.isRSSOwlRunning( feedArgument ) )

    ? ...

    }
    [/code]

    追蹤到 StartupManager.java 見下:

    http://sourceforge.krugle.com/kse/files/cvs/cvs.sourceforge.net/rssowl/RSSOwl/src/java/net/sourceforge/rssowl/controller/thread/StartupManager.java

    追蹤到 StartupManager.isRSSOwlRunning( String message ) 用途為建立ServerSocket,監聽本地8794端口

    [code]
    static ServerSocket applLockSocket;

    public static boolean isRSSOwlRunning( String message )
    {

    ? try{ applLockSocket=new ServerSocket( 8794, 50, InetAddress.getByName( "127.0.0.1" ) );? //1987年9月4日出生?

    ?????? handleSocketUnBound();? //

    ?????? return false;
    ???? }
    ? catch( java.net.BindException e )??? //Another instance already running
    ?????? {
    ???????? ...

    ???????? handleSocketBound( message );? //

    ???????? return true;
    ?????? }?
    ? catch( IOException e )? //Other Error
    ?????? {
    ???????? ...

    ???????? return false;
    ?????? }
    }
    [/code]

    追蹤到 StartupManager.handleSocketUnBound() 和 StartupManager.handleSocketBound( String message )

    [code]
    private static void handleSocketBound( String message )
    {
    ? Socket socket;

    ? try{ socket=new Socket( InetAddress.getByName( "127.0.0.1" ), 8794 );

    ?????? PrintWriter writer=new PrintWriter( new OutputStreamWriter( socket.getOutputStream() ) );

    ?????? writer.println( ( message!=null&&message.length()>0 ) ? message : DEFAULT_MESSAGE );

    ?????? writer.flush();
    ???? }
    ? catch( UnknownHostException e )
    ?????? {
    ???????? ...
    ?????? }
    ? catch( IOException e )
    ?????? {
    ???????? ...
    ?????? }
    }
    [/code]

    [code]
    /**
    ?* Server not yet running. Start it and listen for incoming messages.
    ?*/
    private static void handleSocketUnBound()
    {
    ? listen();? //轉向,為了對稱好看?還是為了兼容?
    }

    /**
    ?* Listen for incoming messages.看看接受的連接發送了什么內容
    ?*/
    private static void listen()
    {
    ? //Run the Server inside a Thread
    ? server=new ExtendedThread()? //extends from Thread
    ? {
    ??? public void run()
    ??? {
    ????? while( !isStopped()&&!isInterrupted() )
    ?????????? {
    ???????????? BufferedReader buffReader=null;

    ???????????? try{ //Read a single line from the Socket
    ????????????????? Socket socket=applLockSocket.accept();

    ????????????????? buffReader=new BufferedReader( new InputStreamReader( socket.getInputStream() ) );

    ????????????????? final String message=buffReader.readLine();

    ????????????????? socket.close();

    ????????????????? //Check the received message
    ????????????????? if( ( message!=null&&message.length()>0 )&&GUI.display!=null&&!GUI.display.isDisposed() )? //激活某個GUI的代碼在此,我們進去看看
    ??????????????????? {
    ????????????????????? GUI.display.asyncExec( new Runnable()
    ????????????????????? {
    ??????????????????????? public void run()
    ??????????????????????? {
    ????????????????????????? //Restore the RSSOwl Window and handle Message
    ????????????????????????? if( GUI.isAlive() )
    ??????????????????????????? {
    ????????????????????????????? GUI.rssOwlGui.restoreWindow();? //找到了,轉到GUI.java

    ????????????????????????????? //Handle the message as Link if valid argument
    ????????????????????????????? if( RSSOwlLoader.isValidArgument( message ) )
    ??????????????????????????????? {
    ????????????????????????????????? GUI.rssOwlGui.getEventManager().actionHandleSuppliedLink( message );
    ??????????????????????????????? }
    ??????????????????????????? }
    ??????????????????????? }
    ????????????????????? } );
    ??????????????????? }
    ??????????????? }
    ???????????? catch( IOException e )
    ????????????????? {
    ??????????????????? ...
    ????????????????? }
    ???????????? finally{ //關閉流
    ??????????????????? }
    ?????????? }
    ??? }
    ? };

    ? server.setDaemon( true );

    ? server.setName( "Startup Manager Thread" );

    ? server.start();
    }
    [/code]

    追蹤到 GUI.java 見下:

    http://sourceforge.krugle.com/kse/files/cvs/cvs.sourceforge.net/rssowl/RSSOwl/src/java/net/sourceforge/rssowl/controller/GUI.java

    追蹤到GUI.restoreWindow()

    [code]
    /**
    ?* Restore the application window either from taskbar or the tray.
    ?*/
    public void restoreWindow()
    {
    ? //RSSOwl is minimized to Tray
    ? if( GlobalSettings.useSystemTray()&&rssOwlSystray!=null&&rssOwlSystray.isMinimizedToTray() )
    ??? {
    ????? rssOwlSystray.restoreWindow();
    ??? }
    ? else{ //RSSOwl is not active
    ??????? shell.forceActive();? //就是它了

    ??????? shell.setMinimized( false );
    ????? }
    }
    [/code]

    原理如下:

    在本地8794端口建立服務監聽,并且一直監聽此端口,試圖接受此端口其它實例(其它程序?)發送的輸入

    如果讀到數據(好像沒有判斷數據的合法性,僅僅判斷數據不為空),并且自己不是“激活”狀態,就“激活”自己;

    如果建立服務監聽不成功,說明已經有實例(其它程序?)占用此端口了,向此端口發送數據喚醒前一個實例,停幾秒以便前一個實例接受,然后退出。

    程序用的是SWT,激活方法用的是shell.forceActive(),but it's not good for core java.

    以上分析如有不對,懇請斧正。



    ?

    posted on 2007-09-01 17:03 NeedJava 閱讀(1471) 評論(1)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 亚洲视频一区二区在线观看| 亚洲一区动漫卡通在线播放| 2015日韩永久免费视频播放| 亚洲最大成人网色香蕉| 国产91久久久久久久免费| 成人性生交大片免费看中文| ww亚洲ww在线观看国产| 国产亚洲AV夜间福利香蕉149| 亚州免费一级毛片| 青青草97国产精品免费观看 | 最近中文字幕mv免费高清电影| 偷自拍亚洲视频在线观看99| 亚洲一区二区三区首页| 免费看一级做a爰片久久| 无码AV片在线观看免费| 国产偷国产偷亚洲高清人| 噜噜噜亚洲色成人网站∨| 亚洲性久久久影院| 午夜一级毛片免费视频| 免费无遮挡无码永久视频| 男人j进女人p免费视频| 学生妹亚洲一区二区| 亚洲四虎永久在线播放| 亚洲精品无码激情AV| 四虎永久在线精品免费网址| 免费人成在线观看网站| 一道本在线免费视频| 亚洲精品无码久久| 亚洲沟沟美女亚洲沟沟| 亚洲乱码国产乱码精品精| 全部免费毛片免费播放| 国产免费看JIZZ视频| 99久久99久久精品免费观看| a级毛片免费观看网站| 亚洲AV无码专区在线厂| 国产午夜亚洲精品| 亚洲国产日韩在线一区| 亚洲最大成人网色| 久久久综合亚洲色一区二区三区| 久久国产成人精品国产成人亚洲| 国产a不卡片精品免费观看 |