应用开发笔记

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 姚先进 阅读(224) | 评论 (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 姚先进 阅读(6163) | 评论 (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 姚先进 阅读(6983) | 评论 (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 姚先进 阅读(2208) | 评论 (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 姚先进 阅读(311) | 评论 (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 姚先进 阅读(811) | 评论 (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 姚先进 阅读(200) | 评论 (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 姚先进 阅读(713) | 评论 (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 姚先进 阅读(219) | 评论 (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 姚先进 阅读(397) | 评论 (0)编辑 收藏
仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页