由于我的手机需要用笔记本开的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. TCP/IP --- UDP Broadcast Address

    Related information link : 百度百科---->广播地址 Use restrictions: 1. You can only broadcast on the same ...

  2. mysql循环获取结果集

    do { MYSQL_RES* res = mysql_store_result(con); ) { MYSQL_ROW row; if (row = mysql_fetch_row(res)) { ...

  3. 10月21日上午MySQL数据库学习内容复习

    1.创建数据库create database 数据库名称删除数据库drop database 数据库名称 2.创建表create table 表名(列名 类型(长度) 自增长 主键 非空,)自增长:a ...

  4. POJ 2388 Who's in the Middle(水~奇数个数排序求中位数)

    题目链接:http://poj.org/problem?id=2388 题目大意: 奇数个数排序求中位数 解题思路:看代码吧! AC Code: #include<stdio.h> #in ...

  5. Visual Studio CLR Profiler

    http://blogs.msdn.com/b/dotnet/archive/2013/04/04/net-memory-allocation-profiling-with-visual-studio ...

  6. PetaPoco 使用总结(一)

    PetaPoco 使用总结(一) 前段时间,公司的一个项目希望用一个ORM 的框架,通过对比 Dapper 和 PetaPoco ,虽然Dapper 功能很强大,速度更快. 但是最终还是选择了比较简单 ...

  7. Window 中安装python多版本环境

    由于python 3 已是目前稳定,且是将来版本版本.新学者可以直接从python3入手学习.但是目前还有很多企业级应用使用的是python 2,可能还得要维护.所以,我们在本地windows中可以安 ...

  8. MyEclipse项目中的java文件的图标变成空心的问题

    今天从SVN更新了一下整个工程,更新完成后发现工程的目录顺序变了,Java文件的图标也由原来实心"J"变成了空心的"J"了,网上查了一下,发现这样的问题不多,解 ...

  9. sqlmap写文件为空之谜

    恰逢有一个SQL注入可以通过sqlmap进行,而且权限高得离谱,直接就是root权限.既然是root权限当然是想直接getshell咯.可是只是sqlmap -u xxx --os-shell的时候却 ...

  10. Yii2 rules验证规则

    Rules验证规则:  required : 必须值验证属性||CRequiredValidator 的别名, 确保了特性不为空. [['字段名1','字段名2'],required]    //字段 ...