zoukankan      html  css  js  c++  java
  • android socket遇到的问题

    最近在玩android,学习到网络这一部分,写了一个电脑本机做服务器,模拟器做客户端的socket通信程序,但手机模拟器客户端就是连不上电脑的服务器端,执行到Socket socket=new Socket("xx.xx.xxx.xxx",8888);就抛异常。我又自己写了一个普通的Java客户端,测试能连上服务器端。所以代码应该没有问题,问题就在于手机模拟器。同学的电脑上装了2.0的android模拟器,我用同学的手机模拟器测试也能连上服务器端。所以可能是模拟器版本的问题。几经周折,无法解决,暂且搁置。

    紧接着,我又写了一个通过Http去请求Tomcat 服务器上的资源,执行到DefaultHttpClient().execute(httpPostRequest)就抛异常,但在模拟器的浏览器上通过同样的地址就可以访问到资源,百度之没解决。

    感觉很郁闷,网络的两个程序都被搁置了,但感觉它们的错误原因应该是一样。故又单步调试之,发现 socket程序出现android.os.NetworkOnMainThreadException异常,百度之,终于找到前两个程序失败的原因了,我用的是Android 4.0版本,而Android 3.0以上对网络有了更多的限制。

    总结如下, Android网络编程要注意以下两点:

    一。android里自己电脑的IP地址是10.0.2.2,不能用127.0.0.1或者localhost,即最好使用自己电脑的IP
    二。Android 3.0以上不能在android的主线程中执行一个网络操作,否则会出现 android.os.NetworkOnMainThreadException异常,因为主线程的操作

    不能超过5秒,否则就报错了,解决方法:
    (1)另开一个线程去做网络连接的操作;
    (2)在activity类中的onCreate方法中添加strict代码,如下:
    Java代码  
    public void onCreate() {     
         .......   
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()        
                .detectDiskReads()        
                .detectDiskWrites()        
                .detectNetwork()   // or .detectAll() for all detectable problems       
                .penaltyLog()        
                .build());        
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()        
                .detectLeakedSqlLiteObjects()     
                .penaltyLog()        
                .penaltyDeath()        
                .build());     
    }    

    问题解决了,很是高兴呀,呵呵

  • 相关阅读:
    [转]Ctags 使用细节
    [转]ctags的使用及相关参数介绍
    [转]ubuntu面板 图标缺失的处理办法
    压缩空气动力自行车
    丰富的开发体验和激动人心的用户体验:XAML
    发现一个控件,介绍一下
    智能电视的设想(发明畅想)
    裹脚布
    整理了《类库开发的设计准则》一文
    关于设计器类程序的模型,先记录下来,怕以后忘记了
  • 原文地址:https://www.cnblogs.com/zhanglanyun/p/2776334.html
Copyright © 2011-2022 走看看