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

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

  • 相关阅读:
    jQuery中获取元素的属性方法attr()简单用法
    【经验】angularjs 实现带查找筛选功能的select下拉框
    【经验】Angularjs 中使用 layDate 日期控件
    在 VPS 上一键安装KMS服务脚本
    Windows 使用 TCPing 工具来获取 TCP延迟、端口通顺情况、已禁Ping服务器的延迟
    Linux 初级教程:初步进入 Linux 世界
    Debian/Ubuntu TCP拥塞控制技术 ——TCP-BBR 一键安装脚本
    Linux 下 iptables 配置详解
    在 Ubuntu 上安装 LaTeX
    代码审计学习之反射型XSS
  • 原文地址:https://www.cnblogs.com/zhanglanyun/p/2776334.html
Copyright © 2011-2022 走看看