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

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

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

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

    Swing禁止重復啟動

    許多程序只允許啟動單個實例,比如我們常用的MSN、OUTLOOK等等。單實例有很多好處,其中最重要一點即是安全。想像一下多人同時修改同一文件的危險,就如我們在J2EE應用程序中所做的那樣,要盡可能考慮到多用戶同時訪問的問題。

      前些日子用SWING為朋友寫了一個程序,其中就有不可同時啟動多個系統實例的要求。由于沒有一個好的思路,所以走了很多彎路?,F在終于解決了,積累了一些心德想與大家分享。

      初遇該問題時,我首先想到的是進程。當程序啟動時判斷操作系統中是否存在該進程,如果存在就退出啟動,否則啟動程序。這個方法在VB或C語言中可以通過調用WIN32?API來實現。在JAVA中,要想實現該方法或許還要借助C的力量。(對于JAVA如何捕獲進程,還請批評指正。)

      放棄了第一種方法,想到了弱智的方法--配置文件。當系統第一次啟動時將標識設置為啟動中,退出時將標識設置為未啟動。但很快就發現,當非法關閉程序(比如關機時未及時關閉程序)后,我們的程序便永遠長眠了。

      其實,在該程序中,最限制我們思路的便是"單機版"這三個字。它給我們的印象是僅供一臺機器單獨使用,與網絡無關的。因此,我們很難將思路整理到服務器與客戶機中去。但要解決該問題恰恰要用到服務器與客戶機的概念。想像一下我們平時啟動電腦的步驟,首先按下加電,有了電,電腦才能啟動。沒錯,只有當電腦未加電,也就是說當我們首次啟動電腦時才會做這個動作,而且這個動作在一段時間內只會做一次。若要重新加電,就必需先斷電?,F在回到我們的程序,有了這個思路,留給我們的問題就是誰來充當電的角色呢?沒錯,就是之前提到過的服務器。程序首次啟動時首先連接指定端口的服務器,發現服務器并未啟動,于是啟動服務器,啟動程序。當程序復數啟動時,再次連接服務器,這時發現服務器已經啟動了,于是就終止啟動。代碼如下:?

    public?class?Console?{
    ??
    /**端口號*/
    ??
    private?static?int?iPort?=?50000;
    ??
    /**主窗口*/
    ??JFrame?frame?
    =?null;?
    ??
    /**
    ??*?系統入口
    ??*?
    @param?String[]?args
    ??*?
    */
    ??
    public?static?void?main(String[]?args)?throws?Exception?{
    ????Socket?socket?
    =?null;?//客戶端連接器
    ????Thread?thread?=?null;?//啟動服務器的線程

    ????
    try?{
    ??????
    //連接服務器
    ??????
    //如果服務器未啟動則拋異常
    ??????(socket?=?new?Socket("localhost",?iPort)).close();
    ??????
    //如果服務器已經啟動則退出系統
    ??????System.exit(0);
    ????}?
    catch?(Exception?e)?{}//未做處理

    ????
    //如果服務器未啟動則在新的線程中啟動服務器
    ????(thread?=?new?Thread(new?Server())).setDaemon(true);
    ????
    //開始線程
    ????thread.start();

    ????
    //啟動主程序
    ????frame?=?new?JFrame("學海無涯");
    ????frame.setVisible(
    true);
    ??}

    ??
    /**
    ??*?端口監聽服務器端運行
    ??*?
    @author?hiswing
    ??
    */
    ??
    static?class?Server?implements?Runnable?{
    ????
    public?final?void?run()?{
    ??????ServerSocket?serversocket?
    =?null;

    ??????
    //查找沒有占用的端口
    ??????while?(iPort?<?60000)?{
    ????????
    try{
    ??????????serversocket?
    =?new?ServerSocket(iPort);
    ????????}
    catch(Exception?ex){
    ??????????iPort
    ++;
    ????????}
    ????????
    break;
    ??????}
    ??????
    try?{
    ????????
    do?{
    ??????????
    //監聽客戶端是否有連接
    ??????????serversocket.accept();

    ??????????
    //窗口在任務欄閃動
    ??????????if(frame.getExtendedState()?==?1)?{
    ????????????frame.setExtendedState(
    0);
    ??????????}
    ??????????
    if(frame.getExtendedState()?!=?1)?{
    ????????????frame.toFront();
    ????????????frame.requestFocus();
    ????????????frame.repaint();
    ??????????}
    ????????}?
    while(true);
    ??????}?
    catch?(Exception?ex)?{
    ????????
    //不做處理
    ??????}
    ????}
    ??}
    }
    由于沒有好的思路,使我們在編程中走了許多彎路,浪費了寶貴的時間。都說軟件是智慧的結晶,一點沒錯。

    posted on 2006-12-11 11:40 蘆葦 閱讀(1894) 評論(1)  編輯  收藏 所屬分類: JAVA

    Feedback

    # re: Swing禁止重復啟動 2015-03-17 12:36 dipoo
    厲害,原來可以這樣  回復  更多評論
      

    主站蜘蛛池模板: 夜夜亚洲天天久久| 色婷婷精品免费视频| 亚洲精品成人网久久久久久| 久久国产精品免费观看| 成人一区二区免费视频| 在线视频网址免费播放| 国产精品视频全国免费观看 | 久久精品国产免费观看三人同眠| 国产精品99久久免费观看| 久久这里只精品国产免费10| 国产猛男猛女超爽免费视频| 国产无遮挡裸体免费视频在线观看 | 免费无码看av的网站| 最近中文字幕大全免费视频| 特黄aa级毛片免费视频播放| 黄色a三级免费看| 一级大黄美女免费播放| 中文字字幕在线高清免费电影| 最近中文字幕大全免费版在线| 无人视频在线观看免费播放影院| 黄页视频在线观看免费| 国产va免费观看| 免费精品久久天干天干| 久久国产乱子伦精品免费不卡| 在线免费观看国产| 免费做爰猛烈吃奶摸视频在线观看| 免费无码黄网站在线观看| 亚洲?V无码乱码国产精品| 在线观看亚洲天天一三视| 亚洲国产第一页www| 国产亚洲精品无码成人| 国产日韩成人亚洲丁香婷婷| 男人的天堂亚洲一区二区三区| 国产精品免费一级在线观看| 毛色毛片免费观看| 亚洲成人一区二区| 亚洲AV成人片色在线观看| 亚洲一区二区三区丝袜| 一区二区亚洲精品精华液 | 亚洲视频在线观看| 中文字幕乱码亚洲无线三区|