應用開發筆記

          2011年05月9日

          android 各種控件顏色值的設置(使用Drawable,Color)

          Filed under: Android開發 — 標簽:, , , , , — admin @ 16:21

          在Android中,如果需要改變控件默認的顏色,包括值的顏色,需要預先在strings.xml中設置,類似字符串,可以反復調用。Android中顏色可以使用drawable或是color來定義。
          本例中strings.xml內容:

          1 2 3 4 5 6 7 8 9 
          <?xml version="1.0" encoding="utf-8"?> <resources>     <string name="hello">Hello World, Main!</string>     <string name="app_name">Color</string>     <drawable name="red">#ff0000</drawable>     <color name="gray">#999999</color>     <color name="blue">#0000ff</color>     <color name="background">#ffffff</color> </resources>

          上面定義了幾個顏色值,下面是在布局文件中的調用,main.xml內容:

          1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 
          <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="vertical"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:background="@color/background"     > <TextView  android:id="@+id/tv1"     android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:text="@string/hello"     android:textColor="@drawable/red"     /> <TextView  android:id="@+id/tv2"     android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:text="@string/hello"     android:textColor="@color/gray"     /> <TextView  android:id="@+id/tv3"     android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:text="@string/hello"     /> </LinearLayout>

          在Java程序中使用:

          1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
          package com.pocketdigi.color;   import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.widget.TextView;   public class Main extends Activity {     /** Called when the activity is first created. */ 	TextView tv1,tv2,tv3;     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);         tv1=(TextView)findViewById(R.id.tv1);         tv2=(TextView)findViewById(R.id.tv2);         tv3=(TextView)findViewById(R.id.tv3);         tv3.setTextColor(Color.BLUE);//直接使用android.graphics.Color的靜態變量         tv2.setTextColor(this.getResources().getColor(R.color.blue));//使用預先設置的顏色值       } }

          這里以TextView為例,其他控件類似.

          posted @ 2013-03-05 15:45 姚先進 閱讀(233) | 評論 (0)編輯 收藏
           

          提示Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead

          提示Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.

          解決方法:

          1.項目右鍵 ->android tools->Fix Project

          2.如果不可以,檢查Project->Properties->Java Compiler

          確認Compiler compliance level被設置為1.7,并且enable specific seetings.

          經過這兩步問題基本解決。

          Eclipse中Compiler compliance level的含義說明

              設置編譯級別既 Eclipse compiler compliance level為較低版本,只是讓編譯器相信你的代碼是兼容較低版本的,在編譯時生成的bytecode(class)兼容較低版本。

              這樣設置與你寫代碼時引用的JDK是沒關系的,也就是說你在寫代碼時仍可以引用較高版本的API.(這樣就可能導 致錯誤)設置compiler compliance level為較低版本,這樣的好處是當別人使用了較低版本的Jdk時也可以引用你寫的編譯后的代碼。它可以保證編譯后的class文件的版本一致性。但 是,如果你的代碼里面(java source)里面調用了較高版本jdk的API.那么即使設置了compiler compliance level為較低版本,在較低版本的JDK上運行你的代碼也會報錯。

              所以建議在寫代碼時引用的JDK,要跟你compiler compliance level設置的版本,是一致。不然會報上面的錯誤。

          posted @ 2013-02-26 19:03 姚先進 閱讀(6186) | 評論 (0)編輯 收藏
           

          環境:主機Win7、VMware Workstation 6.5.3、虛擬機Ubuntu10.04。

           

           

          一、橋接的基本原理
             配置成橋接網絡連接模式的虛擬機就當作主機所在以太網的一部分,虛擬系統和宿主機器的關系,就像連接在同一個Hub上的兩臺 電腦,可以像主機一樣可以訪問以太網中的所有共享資源和網絡連接,可以直接共享主機網絡的互聯網接入線路訪問互聯網。主機與虛擬機之間,以及各虛擬機之間 都可以互訪。對應虛擬機就被當成主機所在以太網上的一個獨立物理機來看待,各虛擬機通過默認的VMnet0網卡與主機以太網連接,虛擬機間的虛擬網絡為 VMnet0。這時你的虛擬機就像局域網中的一個獨立的物理機一樣。虛擬機中的操作系統可以PING通別的主機,反過來別的主機也可以PING虛擬機。想 讓它們相互通訊,你就需要為虛擬系統配置IP地址和子網掩碼,否則就無法通信。
          二、配置步驟

          1、首先判斷VMware Bridge Protocol協議是否已經安裝。在本地連接的屬性中可以查看。如果是精簡版的VMware就很可能沒有安裝。 

          如果沒有安裝,通過以下方法安裝:本地連接-屬性-安裝-服務-添加-從磁盤安裝,選擇VMware安裝目錄下的netbridge.inf,確定 安裝,過程如果提示vmnetBridge.dll和vmnetBridge.sys文件找不到,可以在下一級目錄中找到,拷貝到安裝目錄根路徑。

           

          2、虛擬機中的Ubuntu10.04系統設置為bridged方式聯網。虛擬機-設置-選擇NetWork Adapter-網絡連接-橋接。

           

          3、網絡設置。編輯-編輯虛擬網絡-摘要。查看是否已經有一個默認的橋接網卡,如下面的VMnet0。如果是精簡版的VMware,可能沒有默認的 橋接方式,我之前就安裝的7.01就是這種情況。如果沒有橋接方式,建議重裝一個完整版的虛擬機。自己選擇橋接方式的話,可能出現“不能更改網絡為橋接: 已沒有未橋接的主機網絡適配器”錯誤。

          選擇主機虛擬網絡映射。其中因為是橋接方式聯網,所以VMnet0 要設為物理網卡。

           

          4、查看Win7主機本地連接的設置。

           

          5、啟動Ubuntu10.04虛擬機。設置IP,網關路由及DNS。選擇 系統-管理-網絡。

          在彈出的網絡連接對話框中,選擇有線,編輯已經存在的網絡連接Wired connection 1,選擇IPv4設置,方法-自動,添加地址,輸入IP、掩碼、網關和DNS。IP地址最后一個字段可隨意(不要相同),其余與本地連接相同。

          至此,橋接方式連網設置完畢。重啟網絡。左上角網絡連接圖標,點擊右鍵-關閉網絡,然后重新啟動網絡。

           

          6、嘗試連網。

          posted @ 2013-01-11 15:16 姚先進 閱讀(7003) | 評論 (1)編輯 收藏
           

          假設你已經正確編譯和安裝了Sqlite,寫個測試程序來測試:
          #include <stdlib.h>
          #include <stdio.h>
          #include "sqlite3.h"

          int main(void)
          {
              sqlite3 *db=NULL;
              char *zErrMsg = 0;
              int rc;
              rc=sqlite3_open("test1.db",&db);
              if(rc)
              {
                  fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));
                  sqlite3_close(db);
                  exit(1);
              }
              else printf("open mydata successfully!\n");
              sqlite3_close(db);
              return 0;
          }

          用GCC來編譯的時候總是會出現錯誤,編譯的命令如下
          gcc -static -o hello -lsqlite3 -L /usr/local/lib -I/usr/local/include hello.c
          錯誤信息如下
          /tmp/ccKeKpX9.o(.text+0x37): In function `main':
          : undefined reference to `sqlite3_open'
          /tmp/ccKeKpX9.o(.text+0x51): In function `main':
          : undefined reference to `sqlite3_errmsg'
          /tmp/ccKeKpX9.o(.text+0x73): In function `main':
          : undefined reference to `sqlite3_close'
          /tmp/ccKeKpX9.o(.text+0x9b): In function `main':
          : undefined reference to `sqlite3_close'
          collect2: ld returned 1 exit status

          那么,恭喜你中招了。錯誤根本不在SQLITE也不在你的程序,而在GCC。Gcc的編譯參數是有順序的。正確的編譯命令是:
          gcc -o hello -L /usr/local/lib -I/usr/local/include -static hello.c -lsqlite3

          說實話,這么的一個小問題困擾了我一天的時間!真是菜啊~~~~~~


          posted @ 2013-01-10 14:05 姚先進 閱讀(2270) | 評論 (0)編輯 收藏
           
          QSqlQuery綁定查詢

          來源: ChinaUnix博客  日期: 2009.05.27 08:40 (共有條評論) 我要評論
           
          Approaches to Binding Values
          Below we present the same example using each of the four different binding approaches, as well as one example of binding values to a stored procedure.
          Named binding using named placeholders:
               QSqlQuery query;
               query.prepare("INSERT INTO person (id, forename, surname) "
                             "VALUES (:id, :forename, :surname)");
               query.bindValue(":id", 1001);
               query.bindValue(":forename", "Bart");
               query.bindValue(":surname", "Simpson");
               query.exec();
          Positional binding using named placeholders:
               QSqlQuery query;
               query.prepare("INSERT INTO person (id, forename, surname) "
                             "VALUES (:id, :forename, :surname)");
               query.bindValue(0, 1001);
               query.bindValue(1, "Bart");
               query.bindValue(2, "Simpson");
               query.exec();
          Binding values using positional placeholders (version 1):
               QSqlQuery query;
               query.prepare("INSERT INTO person (id, forename, surname) "
                             "VALUES (?, ?, ?)");
               query.bindValue(0, 1001);
               query.bindValue(1, "Bart");
               query.bindValue(2, "Simpson");
               query.exec();
          Binding values using positional placeholders (version 2):
               QSqlQuery query;
               query.prepare("INSERT INTO person (id, forename, surname) "
                             "VALUES (?, ?, ?)");
               query.addBindValue(1001);
               query.addBindValue("Bart");
               query.addBindValue("Simpson");
               query.exec();
          Binding values to a stored procedure:
          This code calls a stored procedure called AsciiToInt(), passing it a character through its in parameter, and taking its result in the out parameter.
               QSqlQuery query;
               query.prepare("CALL AsciiToInt(?, ?)");
               query.bindValue(0, "A");
               query.bindValue(1, 0, QSql::Out);
               query.exec();
               int i = query.boundValue(1).toInt(); // i is 65
          Note that unbound parameters will retain their values.
          More information to see QT Help.
                         
                         
                         

          本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u2/86708/showart_1945836.html
            發表評論 查看評論(共有條評論)
           
          posted @ 2013-01-09 16:11 姚先進 閱讀(321) | 評論 (0)編輯 收藏
           

          qt ttf 字體太小的解決方法

          分類: 君正jz4755平臺 

          編譯完成qt以后,發現qt的字體太小了

          原因是qt的dpi計算錯誤,這樣的情況會導致qt在不同的平臺上大小不一

          解決的方法就是設置好qt的dpi,

          qt是根據顯示器的物理長度或者寬度于分辨率的關系來計算dpi的, 所以我們設置export QWS_DISPLAY="LinuxFB:mmWidth95:0" export QWS_SIZE="480x272" 這樣qt在所有的平臺上顯示的字體都一樣大了 就好了,

          還有其他的選項,可以參考http://doc.qt.nokia.com/4.6/qt-embedded-displaymanagement.html

          posted @ 2013-01-09 11:07 姚先進 閱讀(870) | 評論 (0)編輯 收藏
           


          標:

          it


          IA32 : 32 bits Intel Architecture (32位帶寬Intel構架)

          IA64 : 64 bits Intel Architecture (64位帶寬Intel構架)

          i386 : Intel 386 ( 老的386機器,也泛指IA32體系的CPU)
          i486 : Intel 486
          i586 : Intel 586 ( Pentium ,K6 級別CPU )
          i686 : Intel 686 ( Pentium II, Pentium III , Pentim 4, K7 級別CPU )

          以上的86 也可以叫做 x86, 通稱說 x86也是指 IA32構架CPU

           

          x86 包含 i386 ,i386 僅僅是 x86 的一部分。
          x86 這里的 x 本來就是一個未知數性質的,他可以是 3、4、5、6、7 。

          x86 是 Intel 建立起來的 CPU 架構。
          他的 8086、8088、80286、80386、80486、Pentium 、Pentium Pro 、Pentium MMX ,Pentium 2 ,還有后面的 P3、P4 、PD 、Core 全系列,Xeon 的 x86 系列。以及 AMD 的 Intel 架構兼容全系列.當然還有最近重新崛起的 VIA 的 C7 系列。
          他們都是 x86 架構。

          更多的 x86 代表的是 32 位的 Intel CPU 架構體系。

          但其中分成很多代。i386 就是 80386 的那代 CPU 的標準,主要是支持 32 位的保護模式和實模式兩種工作環境。這個功能很好很強大,一直沿用至今,而且系統對于這個功能是必須支持的。386 之后的 cpu 是完全兼容 i386 體系的。

          i486 加入了新的一個功能,i586 (奔騰 1 代系列)又加入了新功能,i686 (奔騰 Pro 系列以后)又加入了新的功能體系。
          i386 的軟件可以運行在 i686 系統,但是 i686 的軟件不能運行在之前的架構上。

          舊 CPU 不能運行新軟件主要是不能使用新的特性導致不能運行,但是舊的架構軟件在新的架構上運行,僅僅是不能用新的功能體系,運行效率是沒有減少的。
          而且這個功能架構主要是 Linux 內核在使用。

          只要看到 i 什么 86 ,基本都能用。
          如果有 i686 ,CPU 只要不是 K6 系列,而是 Athlon 系列,最好選擇 i686 ,但如果只有 i386 的,注意安裝后看看你的內核是不是 i686 體系的,如果是,性能不受影響。

          題外:
          i786 是一個隱藏的新體系,聽說只能用在 P4 以后的 Intel CPU 上面。但是很多軟件沒有針對這個架構編寫,所以除非自己基于 i786 編譯,不然網上沒有 i786 的軟件。

          這里還要說 x86_64 體系,這個是 AMD 提出并且最先使用的 x86 新的架構體系。他把 32 位的 i686 架構體系,擴展為 64 位。
          但是因為變動很x86 包含 i386 ,i386 僅僅是 x86 的一部分。


          這里還要說 x86_64 體系,這個是 AMD 提出并且最先使用的 x86 新的架構體系。他把 32 位的 i686 架構體系,擴展為 64 位。
          但是因為變動很大的原因,64 位的系統軟件要兼容 32 位的軟件,需要在內核里打開支持,并且安裝 32 位的兼容庫才行。其實如果你有源代碼,32位系統的源代碼基本上可以直接在 64 位的系統上面編譯成為 64 位架構可運行的軟件(新的技術還是用不上)。 



          同樣 64 位的 CPU 兼容上一代的 i686 架構,i686 CPU 不支持 x86_64 的

          posted @ 2012-12-14 21:16 姚先進 閱讀(208) | 評論 (0)編輯 收藏
           

          在俠客島電腦知識博客中分享了UltraEdit v18 簡體中文版下載:詳情點擊此處

          UltraEdit是一款收費軟件,強烈建議您購買正版UltraEdit軟件,享受優質的售后服務!如果你經濟能力可以使用以下方法對UltraEdit破解激活:

          1,UltraEdit注冊機 :點擊下載

          2,斷掉網絡,安裝完成后,進入UltraEdit軟件,點擊,注冊,輸入以下許可證ID和密碼:

          許可證:blog.itful.com

          密碼:www.finduu.com

          會提示你進行脫機激活,點擊脫機激活后,運行注冊機,將用戶碼1和用戶碼2 分別輸入注冊機的user code位置

          3,點擊注冊機中的Generate,會分別生成Authorization code (驗證碼)1和2,將其復制粘貼到注冊界面的驗證碼處,同時再次輸入以上許可證和密碼。

          4,點擊激活,即可成功完成對UltraEdit的破解激活。

          以上激活方法適合于UltraEdit v17.00.0 至今的所有版本.其他版本不能保住完全適用!

          posted @ 2012-12-10 10:03 姚先進 閱讀(721) | 評論 (0)編輯 收藏
           

          使用 Java 測試網絡連通性的幾種方法

          IBM/DW 發表于 11-27 08:10 11天前, 20回/4746閱, 最后回答: 3天前

          【廈門】 12月22日(周六下午)OSC 源創會 我要報名»

          本文由淺入深地介紹了如何使用 Java 類庫,判斷兩臺機器之間網絡是否可達。本文介紹了 Java 中三種不同的網絡可達的判斷方法以及針對 IPv4 和 IPv6 混合網絡的編程方法。同時也介紹了這些方法的使用場景和優缺點,基本涵蓋了在實際應用中可能碰到的各種情況。

          在網絡編程中,有時我們需要判斷兩臺機器之間的連通性,或者說是一臺機器到另一臺機器的網絡可達性。在系統層面的測試中,我們常常用 Ping 命令來做驗證。盡管 Java 提供了比較豐富的網絡編程類庫(包括在應用層的基于 URL 的網絡資源讀取,基于 TCP/IP 層的 Socket 編程,以及一些輔助的類庫),但是沒有直接提供類似 Ping 命令來測試網絡連通性的方法。本文將介紹如何通過 Java 已有的 API,編程實現各種場景下兩臺機器之間的網絡可達性判斷。在下面的章節中,我們會使用 Java 網絡編程的一些類庫 java.net.InetAddress 和 java.net.Socket,通過例子解釋如何模擬 Ping 命令。

          一般情況下,我們僅僅需要判斷從一臺機器是否可以訪問(Ping)到另一臺機器,此時,可以簡單的使用 Java 類庫中 java.net.InetAddress 類來實現,這個類提供了兩個方法探測遠程機器是否可達

          1boolean isReachable(int timeout) // 測試地址是否可達
          2boolean isReachable(NetworkInterface netif, int ttl, int timeout)
          3// 測試地址是否可達.
          簡單說來,上述方法就是通過遠端機器的 IP 地址構造 InetAddress 對象,然后調用其 isReachable 方法,測試調用機器和遠端機器的網絡可達性。注意到遠端機器可能有多個 IP 地址,因而可能要迭代的測試所有的情況。
          01void isAddressAvailable(String ip){
          02    try{
          03      InetAddress address = InetAddress.getByName(ip);//ping this IP
          04       
          05      if(address instanceof java.net.Inet4Address){
          06         System.out.println(ip + " is ipv4 address");
          07      }else
          08        if(address instanceof java.net.Inet6Address){
          09         System.out.println(ip + " is ipv6 address");
          10      }else{
          11         System.out.println(ip + " is unrecongized");
          12      }
          13       
          14      if(address.isReachable(5000)){
          15          System.out.println("SUCCESS - ping " + IP + " with no interface specified");
          16      }else{
          17         System.out.println("FAILURE - ping " + IP + " with no interface specified");
          18      }
          19       
          20      System.out.println("\n-------Trying different interfaces--------\n");
          21       
          22      Enumeration<NetworkInterface> netInterfaces =
          23            NetworkInterface.getNetworkInterfaces();   
          24      while(netInterfaces.hasMoreElements()) {   
          25           NetworkInterface ni = netInterfaces.nextElement();   
          26           System.out.println(
          27"Checking interface, DisplayName:" + ni.getDisplayName() + ", Name:" + ni.getName());
          28     if(address.isReachable(ni, 0, 5000)){
          29          System.out.println("SUCCESS - ping " + ip);
          30      }else{
          31          System.out.println("FAILURE - ping " + ip);
          32      }
          33       
          34      Enumeration<InetAddress> ips = ni.getInetAddresses();   
          35      while(ips.hasMoreElements()) {   
          36          System.out.println("IP: " + ips.nextElement().getHostAddress());  
          37      }
          38      System.out.println("-------------------------------------------");
          39      }
          40        }catch(Exception e){
          41      System.out.println("error occurs.");
          42      e.printStackTrace();
          43        }      
          44 }
          程序輸出:
          01--------------START--------------
          02 
          03 10.13.20.70 is ipv4 address
          04 SUCCESS - ping 10.13.20.70 with no interface specified
          05 
          06 -------Trying different interfaces--------
          07 
          08 Checking interface, DisplayName:MS TCP Loopback interface, Name:lo
          09 FAILURE - ping 10.13.20.70
          10 IP: 127.0.0.1
          11 -------------------------------------------
          12 Checking interface, DisplayName:Intel(R) Centrino(R) Advanced-N 6200 AGN -
          13 Teefer2 Miniport, Name:eth0
          14 FAILURE - ping 10.13.20.70
          15 IP: 9.123.231.40
          16 -------------------------------------------
          17 Checking interface, DisplayName:Intel(R) 82577LM Gigabit Network Connection -
          18 Teefer2 Miniport, Name:eth1
          19 SUCCESS - ping 10.13.20.70
          20 -------------------------------------------
          21 Checking interface, DisplayName:WAN (PPP/SLIP) Interface, Name:ppp0
          22 SUCCESS - ping 10.13.20.70
          23 IP: 10.0.50.189
          24 -------------------------------------------
          25 
          26 --------------END--------------

          從上可以看出 isReachable 的用法,可以不指定任何接口來判斷遠端網絡的可達性,但這不能區分出數據包是從那個網絡接口發出去的 ( 如果本地有多個網絡接口的話 );而高級版本的 isReachable 則可以指定從本地的哪個網絡接口測試,這樣可以準確的知道遠端網絡可以連通本地的哪個網絡接口。

          但是,Java 本身沒有提供任何方法來判斷本地的哪個 IP 地址可以連通遠端網絡,Java 網絡編程接口也沒有提供方法來訪問 ICMP 協議數據包,因而通過 ICMP 的網絡不可達數據包實現這一點也是不可能的 ( 當然可以用 JNI 來實現,但就和系統平臺相關了 ), 此時可以考慮本文下一節提出的方法。

          在某些情況下,我們可能要確定本地的哪個網絡地址可以連通遠程網絡,以便遠程網絡可以回連到本地使用某些服務或發出某些通知。一個典型的應用場景 是,本地啟動了文件傳輸服務 ( 如 FTP),需要將本地的某個 IP 地址發送到遠端機器,以便遠端機器可以通過該地址下載文件;或者遠端機器提供某些服務,在某些事件發生時通知注冊了獲取這些事件的機器 ( 常見于系統管理領域 ),因而在注冊時需要提供本地的某個可達 ( 從遠端 ) 地址。

          雖然我們可以用 InetAddress.isReachabl 方法判斷出本地的哪個網絡接口可連通遠程玩過,但是由于單個網絡接口是可以配置多個 IP 地址的,因而在此并不合適。我們可以使用 Socket 建立可能的 TCP 連接,進而判斷某個本地 IP 地址是否可達遠程網絡。我們使用 java.net.Socket 類中的 connect 方法

          1void connect(SocketAddress endpoint, int timeout)  //使用Socket連接服務器,指定超時的時間

          這種方法需要遠程的某個端口,該端口可以是任何基于 TCP 協議的開放服務的端口(如一般都會開放的 ECHO 服務端口 7, Linux 的 SSH 服務端口 22 等)。實際上,建立的 TCP 連接被協議棧放置在連接隊列,進而分發到真正處理數據的各個應用服務,由于 UDP 沒有連接的過程,因而基于 UDP 的服務(如 SNMP)無法在此方法中應用。

          具體過程是,枚舉本地的每個網絡地址,建立本地 Socket,在某個端口上嘗試連接遠程地址,如果可以連接上,則說明該本地地址可達遠程網絡。

          01void printReachableIP(InetAddress remoteAddr, int port){
          02    String retIP = null;
          03     
          04    Enumeration<NetworkInterface> netInterfaces;
          05    try{
          06      netInterfaces = NetworkInterface.getNetworkInterfaces();
          07      while(netInterfaces.hasMoreElements()) {   
          08          NetworkInterface ni = netInterfaces.nextElement();   
          09          Enumeration<InetAddress> localAddrs = ni.getInetAddresses();
          10          while(localAddrs.hasMoreElements()){
          11              InetAddress localAddr = localAddrs.nextElement();
          12              if(isReachable(localAddr, remoteAddr, port, 5000)){
          13                      retIP = localAddr.getHostAddress();
          14                      break;       
          15      }
          16      }
          17        }
          18    } catch(SocketException e) {
          19        System.out.println(
          20    "Error occurred while listing all the local network addresses.");
          21    }   
          22    if(retIP == null){
          23        System.out.println("NULL reachable local IP is found!");
          24    }else{
          25        System.out.println("Reachable local IP is found, it is " + retIP);
          26    }       
          27 
          28     
          29 boolean isReachable(InetAddress localInetAddr, InetAddress remoteInetAddr,
          30                   int port, int timeout) {
          31 
          32    booleanisReachable = false;
          33    Socket socket = null;
          34    try{
          35        socket = newSocket();
          36        // 端口號設置為 0 表示在本地挑選一個可用端口進行連接
          37        SocketAddress localSocketAddr = new InetSocketAddress(localInetAddr, 0);
          38        socket.bind(localSocketAddr);
          39        InetSocketAddress endpointSocketAddr =
          40        new InetSocketAddress(remoteInetAddr, port);
          41        socket.connect(endpointSocketAddr, timeout);       
          42        System.out.println("SUCCESS - connection established! Local: " +
          43          localInetAddr.getHostAddress() + " remote: " +
          44          remoteInetAddr.getHostAddress() + " port" + port);
          45        isReachable = true;
          46    } catch(IOException e) {
          47        System.out.println("FAILRE - CAN not connect! Local: " +
          48      localInetAddr.getHostAddress() + " remote: " +
          49      remoteInetAddr.getHostAddress() + " port" + port);
          50    } finally{
          51        if(socket != null) {
          52        try{
          53        socket.close();
          54        } catch(IOException e) {
          55           System.out.println("Error occurred while closing socket..");
          56          }
          57        }
          58    }
          59    return isReachable;
          60 }
          運行結果
          1--------------START--------------
          2 
          3 FAILRE - CAN not connect! Local: 127.0.0.1 remote: 10.8.1.50 port22
          4 FAILRE - CAN not connect! Local: 9.123.231.40 remote: 10.8.1.50 port22
          5 SUCCESS - connection established! Local: 10.0.50.189 remote: 10.8.1.50 port22
          6 Reachable local IP is found, it is 10.0.50.189
          7 
          8--------------END--------------

          當網絡環境中存在 IPv4 和 IPv6,即機器既有 IPv4 地址,又有 IPv6 地址的時候,我們可以對程序進行一些優化,比如

          • 由于 IPv4 和 IPv6 地址之間是無法互相訪問的,因此僅需要判斷 IPv4 地址之間和 IPv6 地址之間的可達性。
          • 對于 IPv4 的換回地址可以不做判斷,對于 IPv6 的 Linklocal 地址也可以跳過測試
          • 根據實際的需要,我們可以優先考慮選擇使用 IPv4 或者 IPv6,提高判斷的效率

          判斷本地地址和遠程地址是否同為 IPv4 或者 IPv6

          1// 判斷是 IPv4 還是 IPv6
          2 if(!((localInetAddr instanceofInet4Address) && (remoteInetAddr instanceofInet4Address)
          3 || (localInetAddr instanceofInet6Address) && (remoteInetAddr instanceofInet6Address))){
          4 // 本地和遠程不是同時是 IPv4 或者 IPv6,跳過這種情況,不作檢測
          5 break;
          6 }
          跳過本地地址和 LinkLocal 地址
          1if( localAddr.isLoopbackAddress() ||
          2     localAddr.isAnyLocalAddress() ||
          3     localAddr.isLinkLocalAddress() ){
          4     // 地址為本地環回地址,跳過
          5     break;
          6 }
          本文列舉集中典型的場景,介紹了通過 Java 網絡編程接口判斷機器之間可達性的幾種方式。在實際應用中,可以根據不同的需要選擇相應的方法稍加修改即可。對于更加特殊的需求,還可以考慮通過 JNI 的方法直接調用系統 API 來實現,能提供更加強大和靈活的功能,這里就不再贅述了。

          文章出處:IBM DW

          posted @ 2012-12-08 22:18 姚先進 閱讀(227) | 評論 (0)編輯 收藏
           
          QT4
          Fedora12下搭建Qt Creator的ARM開發環境 并 移植Qt4.6.2到Micro2440(一)
          參考:
          環境:虛擬機Fedora12(建議安裝Vmware Tools,詳細安裝方法參照Vmware幫助文檔),USB串口,minicom終端。(minicom經常打不開ttyUSB0設備,我的解決方法是,打不開時就將USB串口移除,運行minicom,然后再接上USB串口,此時運行minicom一般都能打開設備)
          軟件準備:
          到http://qt.nokia.com/downloads-cn下載最新版的軟件包,當前是:
          用于 Linux/X11 32位 的 Qt Creator 1.3.1 二進制軟件包qt-creator-linux-x86-opensource-1.3.1.bin(http://qt.nokia.com/downloads/qt-creator-binary-for-linux-x11-32-bit)
          用于嵌入式 Linux 的 Qt 庫 4.6.2包qt-everywhere-opensource-src-4.6.2.tar.gz(http://qt.nokia.com/downloads/embedded-linux-cpp)
          到http://hi.baidu.com/jiyeqian/blog/item/f46d26a2ff3f7da6caefd0d6.html下載arm920t-eabi.tgz(即arm-linux-gcc-4.1.2)(http://qtextended.org/downloads/toolchains/arm920t-eabi.tgz)
          到http://www.arm9.net/download.asp下載Root_Qtopia,我用的是友善光盤里的root_qtopia-20100108.tar.gz(http://www.arm123.com.cn/linux/root_qtopia-20100108.tar.gz)
          下載tslib1.4,這個忘了在哪下載的了,網上有很多,有些不能用,大家自己找個能用的吧。
          將 qt-everywhere-opensource-src-4.6.2.tar.gz 壓縮包解壓為3份,分別編譯 PC ,嵌入式 x86 和 arm 三個版本。
          我在root目錄下建立tmp文件夾,將qt-everywhere-opensource-src-4.6.2.tar.gz直接解壓后復制2分,分別命名為pc、x86、arm。
          1. 編譯 PC 版:
          進入pc目錄
          #./configure
          # gmake
          # gmake install
          安裝過程比較長,沒有碰到過錯誤。
          2. 編譯嵌入式x86版:
          進入x86目錄
          # ./configure -embedded x86 -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb
          # gmake
          # gmake install
          安裝過程比較長,沒有碰到過錯誤。
          編譯安裝PC版中的 qvfb:
          進入pc/tools/qvfb/目錄
          #make
          編譯完畢,將pc/bin目錄下的qvfb文件復制到/usr/local/Trolltech/QtEmbedded-4.6.2/bin目錄。
          3. 編譯嵌入式arm版(需要 arm-linux-gcc 的支持):
          使用友善自帶的ARM-Linux GCC 4.3.2編譯完了,程序移植到開發板上后,出現Segmentation Fault錯誤,按原文,使用4.1.2正常。
          直接將arm920t-eabi.tgz解壓縮到根目錄,不可以像文章中說的那樣“我把它放在:/usr/local/arm/4.1.2/ ”,最起碼我放過去后出錯了。
          把編譯器路徑加入系統環境變量,運行命令:
          #gedit /root/.bashrc
          編輯/root/.bashrc文件,在最后一行加上 export PATH=/opt/toolchains/arm920t-eabi/bin:$PATH

          編譯tslib對觸摸屏支持:
          下載,tslib1.4.tar.gz,解壓后:
          # ./configure --prefix=/usr/local/tslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes
          # make
          # make install
          我下載的包解壓后沒有configure文件,需要運行autogen.sh后才能生成。
          設置環境變量,以便編譯時找到相關的庫:
          # export CPLUS_INCLUDE_PATH=/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/include/c++:/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/include/c++/arm-none-linux-gnueabi
          # export PATH=/opt/toolchains/arm920t-eabi/bin:$PATH

          修改qt-everywhere-opensource-src-4.6.2/mkspecs/qws/linux-arm-g++/qmake.conf 文件(添加lts參數):
          QMAKE_CC                = arm-linux-gcc -lts
          QMAKE_CXX               = arm-linux-g++ -lts
          QMAKE_LINK              = arm-linux-g++ -lts
          QMAKE_LINK_SHLIB        = arm-linux-g++ -lts
          這一步必須有,不然肯定出錯。
          配置:
          必須加上“-prefix /usr/local/Trolltech/QtEmbedded-4.6.2-arm ”參數, 不然安裝后不在QtEmbedded-4.6.2-arm文件夾下,而是覆蓋了QtEmbedded-4.6.2。
          # ./configure \
          -prefix /usr/local/Trolltech/QtEmbedded-4.6.2-arm \
          -opensource \
          -confirm-license \
          -release -shared \
          -embedded arm \
          -xplatform qws/linux-arm-g++ \
          -depths 16,18,24 \
          -fast \
          -optimized-qmake \
          -pch \
          -qt-sql-sqlite \
          -qt-libjpeg \
          -qt-zlib \
          -qt-libpng \
          -qt-freetype \
          -little-endian -host-little-endian \
          -no-qt3support \
          -no-libtiff -no-libmng \
          -no-opengl \
          -no-mmx -no-sse -no-sse2 \
          -no-3dnow \
          -no-openssl \
          -no-webkit \
          -no-qvfb \
          -no-phonon \
          -no-nis \
          -no-opengl \
          -no-cups \
          -no-glib \
          -no-xcursor -no-xfixes -no-xrandr -no-xrender \
          -no-separate-debug-info \
          -nomake examples -nomake tools -nomake docs \
          -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib

          上面劃掉的藍色內容,可以不要的,這樣編輯也不會出錯(虛擬機搞壞了,不得已重裝,配置參數時忘了干上面的工作了,結果發現沒出錯)。

          關于配置參數,參照一下這篇文章吧,可以用configure -embedded –help查看。

          http://www.cuteqt.com/blog/?p=582
          如果你放棄配置,則使用命令:# gmake confclean
          編譯:# gmake
          安裝:# gmake install
          安裝完成后,在 /usr/local/Trolltech 目錄中有三個文件夾:Qt-4.6.2、QtEmbedded-4.6.2、QtEmbedded-4.6.2-arm。
          4、移植
          我是通過NFS啟動的系統,具體操作可以參照友善的手冊,在http://www.arm9.net/download.asp有下載,在第5.5.3節通過NFS啟動系統。
          將Fedora12上  /usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib 中的所有文件復制到/opt/FriendlyARM/mini2440/root_qtopia/usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib目錄中(對應目錄復制,相當于復制到了開發板對應目錄中),其實需要的時候可以裁剪,看原文吧。
          將Fedora12上  /usr/local/tslib 中的庫復制到/opt/FriendlyARM/mini2440/root_qtopia/usr/local中。即將/usr/local/tslib下的所有文件復制到/opt/FriendlyARM/mini2440/root_qtopia/usr/local文件夾下。
          如果運行時還缺少其他的庫,復制方法相同。也可以使用arm-angstrom-linux-gnueabi-readelf -a 程序名 | grep "Share",命令查看需要哪些共享庫,一起復制過去。
          為支持觸摸屏,開機自動設置環境變量,在2440的 /etc/profile中追加:
          export LD_LIBRARY_PATH=/usr/local/lib:$QTDIR/lib:$LD_LIBRARY_PATH                                                  
          export TSLIB_ROOT=/usr/local/lib    
          export TSLIB_TSDEVICE=/dev/input/event0
          export TSLIB_FBDEVICE=/dev/fb0 
          export TSLIB_PLUGINDIR=/usr/local/lib/ts
          export TSLIB_CONSOLEDEVICE=none
          export TSLIB_CONFFILE=/usr/local/etc/ts.conf
          export POINTERCAL_FILE=/etc/pointercal
          export TSLIB_CALIBFILE=/etc/pointercal
          export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
          取消/usr/local/etc/ts.conf中的第一個注釋:
          # module_raw input (去掉#,并且該行頂格)
          我編輯時沒有“#”
          啟動Micro2440運行 /usr/local/bin/ts_calibrate 校正觸摸屏。
          到此Qt4.6.2的移植暫告一段落,移植還沒有完,此時如果在開發板上運行Qt4.6.2-arm編譯的程序,則會出現“relocation error: /usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtGui.so.4: symbol powf, version GLIBCXX_3.4 not defined in file libstdc++.so.6 with link time reference”錯誤。
          今天晚了,明天繼續奉上……
          tslib-1.4.part1.rar (900 K) 下載次數:985 tslib-1.4.part2.rar
          Fedora12下搭建Qt Creator的ARM開發環境 并 移植Qt4.6.2到Micro2440(二)
          繼續……
          5、安裝Qt-creator-1.3.1
          把下載的qt-creator-linux-x86-opensource-1.3.1.bin文件拷到一個目錄(如前面的/root/tmp目錄),進入目錄:
          設置qt-creator-linux-x86-opensource-1.3.1.bin文件為可執行
          #chmod +x qt-creator-linux-x86-opensource-1.3.1.bin
          安裝:
          # ./ qt-creator-linux-x86-opensource-1.3.1.bin
          啟動安裝界面,默認一路Next即可。
          *如果我們下載的是Qt的SDK(qt-sdk-linux-x86-opensource-2010.02.bin),這里可以選擇安裝Qt的開發環境,這樣,在前面安裝pc版Qt那步就可以省了,關鍵是可以省出很多時間的。
          6、Qt-creator開發環境的配置
          啟動Qt-creator。
          在Qt-creator菜單欄Tools—〉Options…打開Options窗口。
          在Options界面左側,點擊Qt4—〉Qt Versions右側顯示Qt Versions設置界面。
          在Qt Versions界面中點擊那個藍色的大“”號圖標
          在下方Version Name:文本框內輸入Qt的版本名,可以隨便填,能區分各個版本即可(如pc版取Qt4.6.2-pc、x86版取QtE4.6.2-x86、arm版取QtE4.6.2-arm)。
          單擊Qmake Location:右側Browse…按鈕,在彈出的“Select QMake Executable”窗口中找到對應版本的qmake程序(按照我們前面安轉的,pc版路徑:/usr/local/Trolltech/Qt-4.6.2/bin/qmake,x86版路徑:/usr/local/Trolltech/QtEmbedded-4.6.2/bin/qmake,arm版路徑:/usr/local/Trolltech/QtEmbedded-4.6.2-arm/bin/qmake),單擊打開,回到Qt Versions界面。
          回到Qt Versions界面,單擊Debugging Helper:右側Rebuild按鈕,等待片刻,看到Debugging Helper:后出現一個綠色的“”即可。
          同理完成其他版本的添加。
          添加完畢,單擊OK按鈕關閉Options窗口。
          到此,Qt-creator配置完畢(我暫時就配置了這些)。
          7、一個例子
          從usr/local/Trolltech/QtEmbedded-4.6.2/demos下復制books例程到root/tmp文件夾下。
          啟動Qt-creator,File—〉Open File or Project…,打開root/tmp/books/books.pro。
          這里我們分兩部分,首先編譯x86下的,并運行在qvfb下,再編譯arm下的,移到開發板下運行。
          7.1、x86下的編譯與調試
          在Qt-creator界面左側點擊Projects圖標,打開工程設置界面。
          從上往下,
          在Edit Project Settings for Project books——〉Build Settings——〉Edit Build Configuration:單擊Add,在下拉列表中選擇Using Qt Version “QtE4.6.2-x86”彈出對話框單擊Ok按鈕,在Edit Build Configuration:下會出現藍色的Make QtE4.6.3-x86 Release active.字符,單擊激活QtE4.6.3-x86 Release。
          在Run Settings——〉Edit run configuration:右側單擊Show Details按鈕,在打開的下拉列表中Arguments:文本框中添加參數“-qws”。
          設置完畢,點擊Edit圖標,回到編輯界面。
          編譯:在Build菜單下,先Clean Project “books”,然后Build Project “books”,在右下角Compile Output窗口能看到編譯信息(按我們上面這樣走來,到此編譯不會出問題的)。
          運行:
          啟動終端,# /usr/local/Trolltech/QtEmbedded-4.6.2/bin/qvfb -width 800 -height 480 &,啟動Qvfb。
          回到Qt-creator,Build——〉Run,運行程序。
          切換我們的Qvfb窗口中,是不是看到Books運行的界面了。
          調試:Debug——〉Start Debugging——〉Start Debugging,即可啟動調試(請保證books路徑中沒有中文名,即不要把books工程放在了某個含有中文字符的文件夾下,不然無法啟動調試)。
          此時感覺如果前面編譯選項Edit Project Settings for Project books——〉Build Settings——〉Edit Build Configuration:選擇Debug項,則調試啟動速度比Release時的要快很多。
          7.2、arm編譯并移植
          編譯:在Projects設置界面下,選擇Using Qt Version “QtE4.6.2-arm”項,余下參數不變,build。
          復制編譯好的文件(也許還有images文件夾)到2440的NFS文件系統的某個目錄下,我直接把books文件夾復制過去了(在Fedora12 文件系統下是/opt/FriendlyARM/mini2440/root_qtopia/home/plg文件夾下)。
          運行及錯誤處理:
          在minicom下面,ps一下,找到qpe進程對應的PID,比如1234,然后通過kill 1234殺死Qtopia。
          進入books目錄,執行./books –qws,此時就會出現前面講到的“relocation error: /usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtGui.so.4: symbol powf, version GLIBCXX_3.4 not defined in file libstdc++.so.6 with link time reference”錯誤。
          我的解決辦法是進入主機/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/lib目錄下找到libstdc++.so.6鏈接的文件libstdc++.so.6.0.8(通過右鍵屬性——〉基本,可以看到鏈接的文件),復制并重命名為libstdc++.so.6到/opt/FriendlyARM/mini2440/root_qtopia/lib文件夾下,之前別忘了將該文件夾下的libstdc++.so.6移到其它地方或重命名,如libstdc++.so.6.old。
          *重命名其實是比較野蠻的方法,可以用ln命令的,參照下面這篇文章……
          http://hi.baidu.com/a263238386/blog/item/362f01ce7b11a10a93457eae.html
          然后再運行./books –qws,看問題是不是解決了!
          這里有個新的問題還沒解決,就是在開發版上運行時字非常小,留著以后處理吧。
          OK!至此,Fedora12下搭建Qt Creator的ARM開發環境 并 移植Qt4.6.2到Micro2440算告一段落了,留下兩個問題:字體非常小的問題、開發板上的遠程調試,留待下次解決。

          posted @ 2012-12-07 12:29 姚先進 閱讀(405) | 評論 (0)編輯 收藏
          僅列出標題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
           
          主站蜘蛛池模板: 长垣县| 昌都县| 马关县| 密云县| 石泉县| 绍兴市| 宽城| 杨浦区| 图木舒克市| 呼图壁县| 上杭县| 营山县| 德令哈市| 清苑县| 定南县| 凉城县| 绩溪县| SHOW| 巩留县| 林周县| 五莲县| 淮安市| 扎兰屯市| 沾化县| 巴里| 体育| 海晏县| 湖南省| 花垣县| 邢台县| 昌都县| 中西区| 永安市| 仁化县| 阿克苏市| 尤溪县| 东平县| 江油市| 石渠县| 宜州市| 什邡市|