由于我的手机需要用笔记本开的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. POJ 1330 Nearest Common Ancestors (最近公共祖先LCA + 详解博客)

    LCA问题的tarjan解法模板 LCA问题 详细 1.二叉搜索树上找两个节点LCA public int query(Node t, Node u, Node v) { int left = u.v ...

  2. UVA12034Race(DP)

    题目链接 题意:A.B两人赛马,最终名次有三种可能:并列第一:A第一,B第二:B第一,A第二.输入n,求 n 人赛马时最终名次的可能,结果对10056取余 分析:对于 i 匹马来说,有 i 中可能,设 ...

  3. 任务二:1、选择器 2、连接集中状态的顺序 3、浮动的用发和原理 4、盒模型在IE和Google等不同浏览器的区别与联系

    1.选择器类型 标签选择器,类选择器,ID选择器,组合选择器,伪类和伪元素,属性选择器,子选择器,同胞选择器, :not()选择器 1.同胞选择器 相邻同胞标签: h2 + p{ color:red; ...

  4. SQL语句注入

    1:       select *from user where username='admin' and password='123456'  or 1='1';    万能密码 2:       ...

  5. ArcGIS Server 10.1 for Linux典型问题总结

    关闭开启server服务: [gis@localhost ArcGISServer]$ cd /home/gis/arcgis/server [gis@localhost server]$ ./sto ...

  6. Ubuntu PostgreSQL安装和配置

    一.安装 1.安装 使用如下命令,会自动安装最新版,这里为9.5 sudo apt-get install postgresql 安装完成后,默认会: (1)创建名为"postgres&qu ...

  7. ERROR 1130 (HY000) Host ‘hostname’ is not allowed to connect to this MySQL server

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; FLUSH PRIVILEGES;

  8. 防SQL注入代码(ASP版)

    <% Dim Fy_Url,Fy_a,Fy_x,Fy_Cs(),Fy_Cl,Fy_Ts,Fy_Zx '---定义部份 头------ Fy_Cl = 1 '处理方式:1=提示信息,2=转向页面, ...

  9. Redis命令大全&中文解释&在线测试命令工具&在线中文文档

    在线测试命令地址:http://try.redis.io/ 官方文档:http://redis.io/commands http://redis.io/documentation Redis 命令参考 ...

  10. some experience duing wrting myweb in php

    书写风格:一切以 最高效, 最简单为 标准!! 不必管格式的规范了! 在html中, 的属性是用双引号, 在php, tp中, 没有特殊情况, 都是用单引号. vim 下how to format c ...