分类归档: Java

解决IE8下FlashSocket无法连接java websocket的问题

参考文章: iOS 与 Java 服务器之间 SSL 握手失败的解决:Cipher Suites

Flash socket在IE8下会使用TLSv1进行通信,且Cipher suites只有有限几项jre默认不支持的。 我服务端用的是Springboot+Tomcat Embed,开启debug之后会看到cipher suite不支持的异常:not found cipher suites in common。

IE8的Cipher Suites: 
Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)     
Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)     
Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)    
Cipher Suite: TLS_RSA_WITH_RC4_128_SHA (0x0005)     
Cipher Suite: TLS_RSA_WITH_RC4_128_MD5 (0x0004)     
Cipher Suite: TLS_RSA_WITH_DES_CBC_SHA (0x0009)

而一般现在装的jdk/jre都是不包含这些的。


可以通过下载下面这个jar替换掉jre的lib/security目录下的两个jar包进行添加。

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Download http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

添加完成之后需要在配置文件中 server.ssl.ciphers 加入,我下面列了一个比较全的,可以用这个替换。    

ciphers: TLS_ECDH_anon_WITH_RC4_128_SHA, TLS_ECDH_ECDSA_WITH_RC4_128_SHA, 
TLS_ECDH_RSA_WITH_RC4_128_SHA, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
TLS_KRB5_EXPORT_WITH_RC4_40_MD5, TLS_KRB5_EXPORT_WITH_RC4_40_SHA
TLS_KRB5_WITH_RC4_128_MD5, TLS_KRB5_WITH_RC4_128_SHA
TLS_DH_anon_WITH_AES_128_GCM_SHA256, TLS_DH_anon_WITH_AES_256_GCM_SHA384
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_RC4_128_MD5, TLS_RSA_WITH_RC4_128_SHA
TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

Read: 170

[转]SMALI文件语法

来源地址:http://bbs.pediy.com/showthread.php?t=151769

参考资料:http://code.google.com/p/smali/wiki/Registers

dalvik字节码有两种类型,原始类型和引用类型。对象和数组是引用类型,其它都是原始类型。
V void,只能用于返回值类型
Z boolean
B byte
S short
C char
I int
J long(64位)
F float
D double(64位)
对象以Lpackage/name/ObjectName;的形式表示。前面的L表示这是一个对象类型,package/name/是该对象所在的 包,ObjectName是对象的名字,“;”表示对象名称的结束。相当于java中的package.name.ObjectName。例 如:Ljava/lang/String;相当于java.lang.String

数组的表示形式
 [I——表示一个整型一维数组,相当于java中的int[]。
 对于多维数组,只要增加[就行了。[[I相当于int[][],[[[I相当于int[][][]。注意每一维的最多255个。
 对象数组的表示:[Ljava/lang/String;表示一个String对象数组。
方法
表示形式:Lpackage/name/ObjectName;->MethodName(III)Z
 Lpackage/name/ObjectName;表示类型,MethodName是方法名。III为参数(在此是3个整型参数),Z是返回类型(bool型)。
 方法的参数是一个接一个的,中间没有隔开。
一个更复杂的例子:
method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
在java中则为:
String method(int, int[][], int, String, Object[])
字段
表示形式:
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
即包名,字段名和各字段类型。
寄存器
在dalvik字节码中,寄存器都是32位的,能够支持任何类型。64位类型(Long和Double型)用2个寄存器表示。
有两种方式指定一个方法中有多少寄存器是可用的。.registers指令指定了方法中寄存器的总数。.locals指令表明了方法中非参寄存器的数量。
方法的传参
 当一个方法被调用的时候,方法的参数被置于最后N个寄存器中。如果一个方法有2个参数,5个寄存器(v0-v4),那么参数将置于最后2个寄存器——v3和v4。
 非静态方法中的第一个参数总是调用该方法的对象。
例如,非静态方法LMyObject;->callMe(II)V有2个整型参数,另外还有一个隐含的LMyObject;参数,所以总共有3个参 数。假如在该方法中指定了5个寄存器(v0-v4),以.registers方式指定5个或以.locals方式指定2个(即2个local寄存器+3个 参数寄存器)。当该方法被调用的时候,调用该方法的对象(即this引用)存放在v2中,第一个整型参数存放在v3中,第二个整型参数存放在v4中。
对于静态方法除了没有隐含的this参数外其它都一样。
寄存器的命名方式
有两种方式——V命名方式和P命名方式。P命名方式中的第一个寄存器就是方法中的第一个参数寄存器。在下表中我们用这两种命名方式来表示上一个例子中有5个寄存器和3个参数的方法。
v0 第一个local register
v1 第二个local register
v2 p0 第一个parameter register
v3 p1 第二个parameter register
v4 p2 第三个parameter register
你可以用任何一种方式来引用参数寄存器——他们没有任何差别。
注意:baksmali默认对参数寄存器使用P命名方式。如果想使用V命名方式,可以使用-pl—no-parameter-registers选项。
使用P命名方式是为了防止以后如果要在方法中增加寄存器,需要对参数寄存器重新进行编号的缺点。
Long/Double值
Long和double类型是64位的,需要2个寄存器(切记切记)。
例如,对于非静态方法LMyObject;->MyMethod(IJZ)V,参数分别是LMyObject;,int,long,bool。故该方法需要5个寄存器来存储参数。

p0 this
p1 I
p2,p3 J
p4 Z

补充:
# static fields             定义静态变量的标记
# instance fields        定义实例变量的标记
# direct methods       定义静态方法的标记
# virtual methods      定义非静态方法的标记
构造函数的返回类型为V,名字为<init>。

if-eq p1, v0, :cond_8 表示如果p1和v0相等,则执行cond_8的流程:
:cond_8
invoke-direct {p0}, Lcom/paul/test/a;->d()V
调用com.paul.test.a的d()方法
if-ne p1, v0, :cond_b 表示不相等则执行cond_b的流程:
:cond_b
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V
invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z
move-result v0

大概意思就是调用com.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法,最后 return v0

 

举两个例子:
sget-object v5, Lcom/google/youngandroid/runtime;->Lit227:Lgnu/mapping/SimpleSymbol;
获取com.google.youngandroid.runtime中的Lit227字段存入v5寄存器,相当于
gnu.mapping.SimpleSymbol localVariable = com.google.youngandroid.runtime.Lit227;

sput-object v0, Lcom/google/youngandroid/runtime;->Lit78:Lkawa/lang/SyntaxTemplate;
Likewise, this is setting the value of a static field. i.e.
设置com.google.youngandroid.runtime.Lit78的值为v0寄存器中的 kawa.lang.SyntaxTemplate类型变量的值。相当于 com.google.youngandroid.runtime.Lit78 = kawa.lang.SyntaxTemplate localVariable;

 

Read: 1296

【转】编程语言/JAVA 转 Netbeans 5.5 界面英文问题解决

Netbeans 5.5 界面英文问题解决

从昨晚搞到现在。Netbeans的界面语言问题终于解决了。

问题:从官网下载的netbeans不论是中文版还是英文版默认的操作界面都是中文,并且字体十分恶心。

目标效果:把界面语言改成英文并使系统正常支持中文。

解决办法:

进入netbeans-5.5etc ,其中netbeans-5.5为netbeans的安装路径。
编辑netbeans.conf
将其中的#command line switchs下面那行变为:
netbeans_default_options=”-J-Xms128m -J-Xmx256m -J-XX:PermSize=32m -J-XX:MaxPermSize=160m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Duser.language=zh -J-Duser.country=US –fontsize 13″

说明:

关于前面几个参数的解释可以参照netbeans的guide:

http://www.netbeans.org/kb/55/using-netbeans/configuring.html#pgfId-1158626

后面的几个参数-J-Duser.language=zh -J-Duser.country=US –fontsize 13是调用java的本身系统属性,设置语言为中文,国家为美国。这点很重要!

国家是美国使netbeans的界面为英文,而语言为中文使netbeans可以支持中文,如果只需要英文则可以把language设为en,不过在调用file browser的时候会发现左边一系列windows特性的中文按钮都回变成乱码。

在netbeans的toolsoptionsfonts&colorssyntax下的language选项设置all languages的default的字体为一个能够支持中文的字体,如:Microsoft YaHei

Read: 1034

[转]使用线程创建的三种方式实现j2me联网功能

src: http://www.javaeye.com/topic/420224

在j2me联网时,在eclipse控制台下有一个警告:“若要避免潜在的死锁,应该在commandAction()处理程序之外的其他线程中执行可能 会阻塞的,操作(如网络连接)。
为了避免潜在的死锁,我们经常把把联网的代码部分写到一个线程中去执行。
而实际应用中,网络连接的事务也都是使用一个单独的线程进行的。

线程的创建可以使用Runnable接口来实现,也可以使用Thread类实现,还可以以匿名内部类的方式创建。在本文中,分别用这三种方式给出 了j2me联网的例子。
代码均测试通过。可以直接使用。
1.通过继承Thread类创建

Java 代码
  1. /**  
  2. * 测 试Thread类线程  
  3. * @author mfcai  
  4. */   
  5.   import java.io.BufferedReader;  
  6. import java.io.IOException;  
  7. import java.io.InputStreamReader;  
  8. import java.io.Reader;  
  9. import java.net.HttpURLConnection;  
  10. import java.net.MalformedURLException;  
  11. import java.net.URL;  
  12.   
  13. public class OpenConn implements Runnable {  
  14.     private HttpURLConnection conn;  
  15.     private URL url;  
  16.   
  17.     // Thread thread1;  
  18.   
  19.     public OpenConn(String url) throws MalformedURLException {  
  20.         this.url = new URL(url);  
  21.     }  
  22.   
  23.     public void run() {  
  24.         try {  
  25.             conn = (HttpURLConnection) url.openConnection();  
  26.         } catch (IOException e) {  
  27.             e.printStackTrace();  
  28.             url = null;  
  29.         }  
  30.     }  
  31.   
  32.     public HttpURLConnection getConn() {  
  33.         return conn;  
  34.     }  
  35.   
  36.     public static void main(String[] args) throws Exception {  
  37.         // 创建Runnable类  
  38.         OpenConn openConn = new OpenConn("http://www.google.com");  
  39.         // 创建线程  
  40.         Thread thread = new Thread(openConn);  
  41.         // openConn.thread1=thread;  
  42.         thread.start();  
  43.         thread.join(10000);// wait 10 seconds  
  44.         HttpURLConnection c = openConn.getConn();  
  45.         if (c != null) {  
  46.             System.out.println("连接网络成功…");  
  47.             BufferedReader r = new BufferedReader(new InputStreamReader(c  
  48.                     .getInputStream()));  
  49.             String s = r.readLine();  
  50.             while (s != null) {  
  51.                 System.out.println(s);  
  52.                 s = r.readLine();  
  53.             }  
  54.         } else {  
  55.             System.out.println("超时错误,连接网络失败…");  
  56.         }  
  57.     }  
  58. }  
/**  * 测试Thread类线程  * @author mfcai  */    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;  public class OpenConn implements Runnable {  private HttpURLConnection conn;  private URL url;   // Thread thread1;   public OpenConn(String url) throws MalformedURLException {   this.url = new URL(url);  }   public void run() {   try {    conn = (HttpURLConnection) url.openConnection();   } catch (IOException e) {    e.printStackTrace();    url = null;   }  }   public HttpURLConnection getConn() {   return conn;  }   public static void main(String[] args) throws Exception {   // 创建Runnable类   OpenConn openConn = new OpenConn("http://www.google.com");   // 创建线程   Thread thread = new Thread(openConn);   // openConn.thread1=thread;   thread.start();   thread.join(10000);// wait 10 seconds   HttpURLConnection c = openConn.getConn();   if (c != null) {    System.out.println("连接网络成功...");    BufferedReader r = new BufferedReader(new InputStreamReader(c      .getInputStream()));    String s = r.readLine();    while (s != null) {     System.out.println(s);     s = r.readLine();    }   } else {    System.out.println("超时错误,连接网络失败...");   }  } }

2.通过引用Runnable接口创建

Java 代码
  1. /**  
  2. * 测 试Runnable接口线程  
  3. * @author mfcai  
  4. */   
  5. import java.io.BufferedReader;  
  6. import java.io.IOException;  
  7. import java.io.InputStreamReader;  
  8. import java.io.Reader;  
  9. import java.net.HttpURLConnection;  
  10. import java.net.MalformedURLException;  
  11. import java.net.URL;  
  12.   
  13. public class OpenConn2 extends Thread {  
  14.     private HttpURLConnection conn;  
  15.     private URL url;  
  16.   
  17.     public OpenConn2(String url) throws MalformedURLException {  
  18.         this.url = new URL(url);  
  19.     }  
  20.   
  21.     public void run() {  
  22.         try {  
  23.             conn = (HttpURLConnection) url.openConnection();  
  24.         } catch (IOException e) {  
  25.             e.printStackTrace();  
  26.             url = null;  
  27.         }  
  28.     }  
  29.   
  30.     public HttpURLConnection getConn() {  
  31.         return conn;  
  32.     }  
  33.   
  34.     public static void main(String[] args) throws Exception {  
  35.         OpenConn2 openConn = new OpenConn2("http://www.google.com");  
  36.         openConn.start();  
  37.         openConn.join(10000);// wait 10 seconds  
  38.         HttpURLConnection c = openConn.getConn();  
  39.         if (c != null) {  
  40.             System.out.println("连接网络成功…");  
  41.             BufferedReader r = new BufferedReader(new InputStreamReader(c  
  42.                     .getInputStream()));  
  43.             String s = r.readLine();  
  44.             while (s != null) {  
  45.                 System.out.println(s);  
  46.                 s = r.readLine();  
  47.             }  
  48.         } else {  
  49.             System.out.println("超时错误,连接网络失败…");  
  50.         }  
  51.     }  
  52. }  
/**  * 测试Runnable接口线程  * @author mfcai  */  import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;  public class OpenConn2 extends Thread {  private HttpURLConnection conn;  private URL url;   public OpenConn2(String url) throws MalformedURLException {   this.url = new URL(url);  }   public void run() {   try {    conn = (HttpURLConnection) url.openConnection();   } catch (IOException e) {    e.printStackTrace();    url = null;   }  }   public HttpURLConnection getConn() {   return conn;  }   public static void main(String[] args) throws Exception {   OpenConn2 openConn = new OpenConn2("http://www.google.com");   openConn.start();   openConn.join(10000);// wait 10 seconds   HttpURLConnection c = openConn.getConn();   if (c != null) {    System.out.println("连接网络成功...");    BufferedReader r = new BufferedReader(new InputStreamReader(c      .getInputStream()));    String s = r.readLine();    while (s != null) {     System.out.println(s);     s = r.readLine();    }   } else {    System.out.println("超时错误,连接网络失败...");   }  } }

3.以匿名内部类的方式创建
即在一个方法中创建线程,当方法被调用时,线程即启动,如下:

Java 代码
  1. /**  
  2. * 测 试匿名线程线程创建  
  3. * @author mfcai  
  4. */   
  5.   
  6.   
  7. import java.io.BufferedReader;  
  8. import java.io.IOException;  
  9. import java.io.InputStreamReader;  
  10. import java.net.HttpURLConnection;  
  11. import java.net.URL;  
  12.   
  13. public class OpenConn3 {  
  14.     private HttpURLConnection conn;  
  15.     private URL url;  
  16.       
  17.     public static void main(String[] args){  
  18.         try{  
  19.             OpenConn3 open3= new OpenConn3();  
  20.             open3.strartMyThread();  
  21.         }catch(Exception ex){  
  22.             System.out.println(ex.toString());  
  23.         }  
  24.     }  
  25.      public void strartMyThread() throws Exception{   
  26.          this.url =new URL("http://www.google.com");  
  27.          java.lang.Runnable runner=new Runnable(){  
  28.              public void run(){   
  29.                  try {  
  30.                         conn = (HttpURLConnection) url.openConnection();  
  31.                     } catch (IOException e) {  
  32.                         e.printStackTrace();  
  33.                         url = null;  
  34.                     }  
  35.              }  
  36.   
  37.          };  
  38.          Thread openConn=new Thread(runner);   
  39.          openConn.start();   
  40.          openConn.join(10000);// wait 10 seconds  
  41.   
  42.         if (conn != null) {  
  43.             System.out.println("连接网络成功…");  
  44.             BufferedReader r = new BufferedReader(new InputStreamReader(conn  
  45.                     .getInputStream()));  
  46.             String s = r.readLine();  
  47.             while (s != null) {  
  48.                 System.out.println(s);  
  49.                 s = r.readLine();  
  50.             }  
  51.         } else {  
  52.             System.out.println("超时错误,连接网络失败…");  
  53.         }  
  54.   
  55.      }  
  56. }  
/**  * 测试匿名线程线程创建  * @author mfcai  */    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL;  public class OpenConn3 {  private HttpURLConnection conn;  private URL url;    public static void main(String[] args){   try{    OpenConn3 open3= new OpenConn3();    open3.strartMyThread();   }catch(Exception ex){    System.out.println(ex.toString());   }  }   public void strartMyThread() throws Exception{     this.url =new URL("http://www.google.com");          java.lang.Runnable runner=new Runnable(){           public void run(){             try {             conn = (HttpURLConnection) url.openConnection();            } catch (IOException e) {             e.printStackTrace();             url = null;            }           }           };          Thread openConn=new Thread(runner);           openConn.start();           openConn.join(10000);// wait 10 seconds     if (conn != null) {     System.out.println("连接网络成功...");     BufferedReader r = new BufferedReader(new InputStreamReader(conn       .getInputStream()));     String s = r.readLine();     while (s != null) {      System.out.println(s);      s = r.readLine();     }    } else {     System.out.println("超时错误,连接网络失败...");    }    } }

转载请注明作者和出处。

Read: 1072