• 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());     
    }    

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

  • 相关阅读:
    燕园笔记之一——穿梭
    openvc学习笔记(1)——简单应用
    匆匆过客
    opencv学习(3)——高斯平滑图像
    为什么(win10系统)电脑上面的鼠标(触摸板)突然用不了?怎么开启和关闭、
    SqlServer自动备份数据库
    CodeSmith批量生成实体类
    XML文件的序列化和反序列化
    AjaxPro的使用
    设计模式之——策略模式
  • 原文地址:https://www.cnblogs.com/zhanglanyun/p/2776334.html
Copyright © 2020-2023  润新知