android项目socket编程时遇到的问题

来源:互联网 发布:淘宝上开茶叶店 编辑:程序博客网 时间:2024/06/03 16:17

出处:http://blog.csdn.net/cxllyg/article/details/7460187?reload#reply

最近在玩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());    
 }    

 

 

 

 

http://blog.csdn.net/xys289187120/article/details/6636331《android调试程序相关知识。如bug,logcat,真机测试详解。》

 

 

我的项目问题:

1.起初一直报远程主机强制中止程序的错误,经查询。http://blog.csdn.net/love_world_/article/details/8130416    原来是因为两个eclipse开启的原因。

2.写的很简单的服务器与客户端的程序,只是连接的操作,如果连接成功两边各有自己写的输出语句。但是我项目的socket.accept()总是不执行,不知道为什么?后来换了个端口号。结果成功了!

3.因为上述调试只是两个java程序main函数执行,放入android中仍然不能执行。后经http://blog.csdn.net/cxllyg/article/details/7460187?reload#reply (即上面内容)在项目中加了以上代码。且导入相关包及提示选择加入了

@TargetApi(Build.VERSION_CODES.GINGERBREAD)
 @SuppressLint("NewApi")

进行测试。项目运行成功!!!

 

很开心,很激动。

原创粉丝点击