您的位置:首页 > 理论基础 > 计算机网络

Socket_TcpClient学习开发中不经意的小问题。

2015-07-17 15:04 211 查看
基于Socket编程是网络编程的基础。一个完整的网络通信需要一个五元组来标识:协议、本地地址、本地端口号、远端地址、远端端口号。Socket编程有TCP和UDP两种,TCP是基于连接的,而UDP是无连接的。本次项目需要的是TCP客户端APP,故主要说明TCP。TCP是基于Client/Server通信模式的,在客户/服务器模式中我们将请求服务的一方称为客户(client),将提供某种服务的一方称为服务器(server)。

客户机/服务器的请求/响应过程示意图如下所示。



图1 客户/服务器通信模型

在了解了Socket编程基础之后,就需要真刀真枪的干了。TCPclient的开发demo有很多。在搜寻了之后,Android应用开发提高篇(4)-----Socket编程(多线程、双向通信),这片博文比较适合初学者,比较容易让人理解Socket编程的过程。
下面遇到的问题都是基于上篇博文的代码。

问题一:按照博文代码,新建android工程之后,生成APK文件,安装之后。发现一点击“连接”,APP就显示“很抱歉,**已停止运行”。
解决过程:这个问题纠结了我很久。代码是源代码,不可能有问题。那就是我的工程有问题。我参照自己的工程和网上成熟的TCPclient_demo进行了对比。在AndroidMainfest.XML发现缺少了:
<uses-permissionandroid:name="android.permission.INTERNET"/>联网许可,需添加。
还有
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17"
/> 自动生成工程中设置了目标SDK版本,需将android:targetSdkVersion="17"删除。
原因:targetSdkVersion如果设置了此属性,那么在程序执行时,如果目标设备的API版本正好等于此数值,他会告诉Android平台:此程序在此版本已经经过充分测,没有问题。不必为此程序开启兼容性检查判断的工作了。也就是说,如果targetSdkVersion与目标设备的API版本相同时,运行效率可能会高一些。但是,这个设置仅仅是一个声明、一个通知,不会有太实质的作用,比如说,使用了targetSdkVersion这个SDK版本中的一个特性,但是这个特性在低版本中是不支持的,那么在低版本的API设备上运行程序时,可能会报错:java.lang.VerifyError。也就是说,此属性不会帮你解决兼容性的测试问题。你至少需要在minSdkVersion这个版本上将程序完整的跑一遍来确定兼容性是没有问题的。所以最好不要加。本人将之删除或者将“17”改为“8”与minSdkVersion对应都可解决问题。

问题二:进入界面之后自动跳出软键盘。
解决方法:在AndroidMainfest.XML相对应的activity中加入:
android:windowSoftInputMode="stateHidden|adjustPan"
如: <activity
android:name="com.test.BTClient.BTClient1"
android:windowSoftInputMode="stateHidden|adjustPan"/>需加入
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: