由于我的手机需要用笔记本开的wifi,躺在床上玩手机时需要关电脑或者是要让电脑放歌的时候总是不想下床,于是我想能不能用一个APP,然后通过局域网实现在手机上对电脑进行操控呢?说干就干。

我在电脑上用的是C++作为服务器,  然后在android手机上用socket连接电脑。在向电脑发送我要电脑执行的命令时,完全没有问题,可以正常发送,只要在电脑收到消息时处理一下乱码就可以了。同时,我想要在电脑处理了我发送的命令之后返回执行的结果,在这个地方出问题了。当我尝试在客户端启动接收消息的独立线程的时候,程序总是刚连接就挂了。然后把启动这个线程的代码注释掉重新编译就不会挂,但这样就没有办法接收返回的执行结果了,这是为什么呢?尝试了很多遍。

终于,今天我想到了一个可能的原因,android不能在主线程中访问网络,那么同理,是不是在子线程中也不能改变UI呢?(因为android的主线程就是UI线程)抱着试试看的心态,我试了一下在这个接收消息的线程中接收到消息之后不在UI上显示出来,只接收,但还是挂了。不对,但是我感觉这应该不是接收消息的问题了,在仔细看了一下代码之后,我发现,我的接收消息的线程启动的语句在连接服务器的语句后面,我连接服务器也是用了一个独立的线程来完成连接操作,瞬间我想到了为什么了。这个只是连接线程的入口,执行到这一句的下一句的时候并不意味着socket已经连接好了。因为并不是在同一个线程中,如果在这里启动接收消息的线程,当然会出问题,而且因为只是简单的做个测试,所以我的接收消息的时候并没有判断socket是不是连接的。

然后我的程序终于没有在第一次运行的时候就挂了。然而事情并没有想象的那么顺利,当我尝试在客户端循环接收服务器发来的消息的时候,问题又出现了。我用的是Bufferreader来读的。我尝试着把Bufferreader对象的定义放在readLine的前面,也就是说每一次readLine之前都要new 一次Bufferreader对象,重新绑定到socket上。线程的代码如下:

public class thread_reve extends Thread {
public String str_reve = null;
@Override
public void run() {
super.run();
while(true) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(mainsocket.getInputStream()));
str_reve = reader.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(!str_reve.equals("")) {
message += "\r\n";
message += str_reve;
}
}
}
};

终于,在经历了重重磨难之后,我看到客户端可以终于可以很顺畅的接收客户端发来的每一条消息了。总结一下,如果我试了很多次不行的话就轻易放弃,当然得不到最后的成功。我会记住这次的教训。

android socket编程用Bufferreader读取的一个失败教训的更多相关文章

  1. Android Socket编程

    花了大概两天的时间,终于把Android的Socket编程给整明白了.抽空和大家分享一下: Socket Programming on Android Socket 编程基础知识: 主要分服务器端编程 ...

  2. Android Socket编程学习笔记

    http://blog.csdn.net/eyu8874521/article/details/8847173 度娘给出的描述:通常也称作"套接字",用于描述IP地址和端口,是一个 ...

  3. Android Socket编程基础

    前些天写了一个Android手机在局域网内利用Wifi进行文件传输的Demo,其中用到了Socket编程,故此总结(盗了网友的一些图和文字).好久好久没来博客园了~~ 1.什么是Socket? soc ...

  4. python socket编程---从使用Python开发一个Socket示例说到开发者的思维和习惯问题

    今天主要说的是一个开发者的思维和习惯问题. 思维包括编程的思维和解决一个具体问题的分析思维,分析思路,分析方法,甚至是分析工具. 无论是好习惯还是不好的习惯,都是在者一天一天的思维中形成的.那些不好的 ...

  5. 利用socket编程在ESP32上搭建一个TCP客户端

    通过之前http://www.cnblogs.com/noticeable/p/7636582.html中对socket的编程,已经可以知道如何通过socket编程搭建服务器和客户端了,现在,就在ES ...

  6. android Socket 编程

    Socket 通信 1.UDP实现  (DatagramSocket) [客户端] //首先创建一个DatagramSocket对象 DatagramSocket socket = new Datag ...

  7. 简单理解php的socket编程

    php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络 ...

  8. 读懂Java中的Socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  9. Java Socket 编程指南

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

随机推荐

  1. POJ3928 Pingpong(统计比 K 小的个数 + 树状数组)

    Ping pong Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2691   Accepted: 996 Descript ...

  2. Apache+php+mysql+SQLyog在windows7下的安装与配置图解

    先准备好软件: Apache官方下载地址:httpd-2.2.25-win32-x86-openssl-0.9.8y.msi,更多版本在这里: php官方下载地址:php-5.4.37-Win32-V ...

  3. jquery id选择器 id带"."问题

    例如控件ID为user.id 使用$("#user.id")不能得到正确的结果 必须使用\\转义 即$("#user\\.id")

  4. time模块

    In [1]: import time In [2]: import datetime In [3]: date_time = datetime.datetime.now() In [4]: prin ...

  5. 个人js

    1.网页右侧地图浮动楼层,超过100px就显示 $(window).scroll(function(){ ){ //距顶部多少像素时,出现返回顶部按钮 $("#floor").fa ...

  6. MVC实现动态二级域名

    前段时间,一个朋友问我ASP.NET MVC下实现动态二级域名的问题.跟他聊了一些解决方案,这里也总结一下,以供参考. 相信大家都发现类似58同城这样的网站,成都的网址是cd.58.com 上海的是s ...

  7. Django笔记-登陆注册-1

    1.项目结构(eclipse+PyDev工具)(粘上来后代码缩进格式没有了,就先不整了) 2.关键代码: test_log03.settings.py INSTALLED_APPS = ( 'djan ...

  8. C#根据时间产生有序的GUID编码

    public static Guid GenerateGuid() { byte[] guidArray = Guid.NewGuid().ToByteArray(); , , ); DateTime ...

  9. log4j2 使用

    转载自 Blog of 天外的星星: http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html Log4j 2的好处就不和大家说了,如果你搜了2,说明你 ...

  10. [MongoDB]Profiling性能分析

    摘要 上篇文章介绍了mapReduce这个聚合操作.本篇将继续学习,db有了,collection和document也有,基本上够用了,但是随着项目上线后,发现业务数据越来越多,查询效率越来越慢,这时 ...