美文网首页需要使用
关于Android项目中Socket通信的那点事文章

关于Android项目中Socket通信的那点事文章

作者: mapboo | 来源:发表于2017-09-12 23:18 被阅读55次

Socket方面的知识点,相关的资料,如博客、视频、教程、官方文档等举不胜举,这里就不再赘述一遍了,只是笔者近日对项目中遇到的一点问题和思考做个总结,确切的来说,是对其中一篇博客的批注和补充吧,因为按照该博客的描述,会出现一些问题,笔者测试良久,或许写出来对一些朋友会有参考价值。

—前序

程序员,我们绝不重复造轮子,所以关于Socket,请看这位朋友的原创技术博客:Android:这是一份很详细的Socket使用攻略.

该博客详细描述了Socket的前世今生吧,非常感谢作者的无私奉献,是初学者非常好的技术资料,本人因项目需要TCP通信发送/接收数据,所以搜索一番就以该博客作为参考代码编写(搬运代码前,请一定要先读懂代码,切记切记);

—问题

客户端-Android应用程序APP;

服务端-PC上的一个TCP调试工具;

第一步,运行服务端工具,绑定端口即可;

第二步,运行APP,连接服务端,连接正常;

第三步,APP发送数据给服务端,正常接收;

第四步,服务端发送数据给APP,歇菜了,歇菜了...

—验证

既然问题出在了第四步,也是非常关键的功能点,必须破解才行,台阶如下:

思路一:自我怀疑

检查代码,检查代码,检查代码,重要的事说三遍,注意:该博客是点击获取服务端信息,这个不得不说,与现实是不符合的,至少笔者项目是连接成功后会持续接收服务端的发来的数据,用于刷新饼图、柱状图等信息,这里代码需要修改下,也就是加上无限循环while,必须如此;

思路二:三方验证

一番排斥,基本确定代码方面是没有问题,逻辑也是没有问题的,对没有初始化socket实例这种低级错误就不要犯了,于是乎下载了一个第三方的一个TCP调试APP,同样方式测试,第一步到第三步都没问题,第四步,居然服务端发来的这个调试APP收到了,收到了,收到了,那一刻,笔者的心是碎的,碎的,碎碎的;

思路三:断点调试

既然代码逻辑没有问题,三方验证已经毫无疑问的说明笔者代码是有问题的,开启Android的断点调试,吐槽下,断点调试比起iOS的来说,简直啰嗦,繁杂,报错乱七八糟,可能iOS的舒服让笔者有些鄙视Android吧,甚至比起VS的断点调试都差一截,不说了,Android也有优点,自己体会吧;

情况应该是这样的,while循环应该一直执行,断点发现,只执行一次,也就是while不重复循环,这怎么能持续呢,最后发现断点停在这句代码(博客157号代码):

//步骤3:通过输入流读取器对象接收服务器发送过来的数据

response = br.readLine();

初步推断线程卡住了,一直在读取,无法结束,导致while无法持续的工作,简单屏蔽可验证,也没有什么意义,问题应该找到了吧;

思路四:对比编码

先入为主,笔者一直用该博客的方式接收数据,当然了,其实也可以采用其他方式读取数据啊,于是乎,代码瞬间风格异变,进一步与本功能逻辑融合,几分钟后,APP接收到了服务器发来的问候,就这样,第四步也顺利解决了,可惜整个下午就这样过去了;

—代码

奉上相关修改后的代码供参考,有啥问题留言即可,笔者比较忙,谢谢,有问题参考如上思路请自行解决;

-更新UI

[java]view plaincopy

print?

// 实例化主线程,用于更新接收过来的消息

mMainHandler =newHandler() {

@Override

publicvoidhandleMessage(Message msg) {

switch(msg.what) {

case0:

mShowtext.setText(mShowtext.getText() +"--"+ msg.obj.toString());

break;

}

}

};

-接收数据(注意 这里和参考博客是不一样的,仔细看吧)

[java]view plaincopy

print?

/**

* 接收 服务器消息

*/

privatevoidreadMessage(){

// 利用线程池直接开启一个线程 & 执行该线程

mThreadPool.execute(newRunnable() {

@Override

publicvoidrun() {

try{

while(true) {

if(socket !=null){

// 步骤1:创建输入流对象InputStream

is = socket.getInputStream();

// 步骤2:创建输入流读取器对象 并传入输入流对象

InputStream inputStream = socket.getInputStream();

DataInputStream input =newDataInputStream(inputStream);

// 步骤3:接收服务器发送过来的数据

byte[] b =newbyte[10000];

intlength = input.read(b);

String Msg =newString(b,0, length,"utf-8");

Log.i("TAGG","收到数据"+ Msg);

// 步骤4:通知主线程,将接收的消息显示到界面

Message message =newMessage();

message.what =0;

message.obj = Msg;

mMainHandler.sendMessage(message);

}

}

}catch(IOException e) {

e.printStackTrace();

}

}

});

}

—总结

1,该博客是个好博客,作者也是个耿直的少年,只是实战方面略差一点;

2,TCP客户端是个while无限循环接收的过程,该博客没有说明,有些不合理;

3,TCP服务端应该是包含多个socket,主socket主要负责接收客户端来的连接,每接收一个socket就会创建一个新的与该socket通信,然后让他们自己玩自己的,这是客户端的简单描述,具体可参考该博客,笔者不做测试;

4,TCP客户端接收数据要与服务端发送编码格式一致,比如都采用utf-8,不然会乱码出现;

5,心态很重要,耐心很重要,最重要的是要相信解决了这个bug,还会有新的bug,所以急不得,参考笔者思路解决;

6,笔者记录此文,只是觉的在编码的路上,太寂寞了,太孤寂了;

—END

相关文章

网友评论

    本文标题:关于Android项目中Socket通信的那点事文章

    本文链接:https://www.haomeiwen.com/subject/yewhsxtx.html