<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
    主站蜘蛛池模板: 好大好深好猛好爽视频免费| 国产精品免费大片| 免费观看的毛片手机视频| 亚洲国产视频一区| 波多野结衣中文字幕免费视频| 无码久久精品国产亚洲Av影片| 成全视频免费观看在线看| 亚洲情侣偷拍精品| 国产免费久久久久久无码| 亚洲人成电影网站国产精品| 一区二区视频在线免费观看| 亚洲精品网站在线观看不卡无广告 | 国产精品免费福利久久| 精品久久久久久亚洲| 久久久受www免费人成| 亚洲毛片αv无线播放一区| 在线看片免费人成视频福利| 亚洲三级电影网站| 69成人免费视频| 色偷偷尼玛图亚洲综合| 亚洲天堂中文字幕在线| 成在人线av无码免费高潮喷水| 亚洲av成人无码久久精品| 57pao国产成永久免费视频| 亚洲综合无码无在线观看| 又大又黄又粗又爽的免费视频 | 日本免费中文视频| 色偷偷女男人的天堂亚洲网| 日韩成人免费视频播放| 国产va免费精品| 亚洲精品国产福利片| 韩国免费三片在线视频| 国产日韩精品无码区免费专区国产 | 亚洲av成人一区二区三区在线观看| eeuss影院免费92242部| 亚洲天天做日日做天天看| 暖暖在线日本免费中文| 最近的2019免费中文字幕| 亚洲精品456人成在线| 亚洲中文字幕视频国产| 免费观看美女用震蛋喷水的视频|