android socket编程用Bufferreader读取的一个失败教训
由于我的手机需要用笔记本开的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读取的一个失败教训的更多相关文章
- Android Socket编程
		花了大概两天的时间,终于把Android的Socket编程给整明白了.抽空和大家分享一下: Socket Programming on Android Socket 编程基础知识: 主要分服务器端编程 ... 
- Android Socket编程学习笔记
		http://blog.csdn.net/eyu8874521/article/details/8847173 度娘给出的描述:通常也称作"套接字",用于描述IP地址和端口,是一个 ... 
- Android Socket编程基础
		前些天写了一个Android手机在局域网内利用Wifi进行文件传输的Demo,其中用到了Socket编程,故此总结(盗了网友的一些图和文字).好久好久没来博客园了~~ 1.什么是Socket? soc ... 
- python  socket编程---从使用Python开发一个Socket示例说到开发者的思维和习惯问题
		今天主要说的是一个开发者的思维和习惯问题. 思维包括编程的思维和解决一个具体问题的分析思维,分析思路,分析方法,甚至是分析工具. 无论是好习惯还是不好的习惯,都是在者一天一天的思维中形成的.那些不好的 ... 
- 利用socket编程在ESP32上搭建一个TCP客户端
		通过之前http://www.cnblogs.com/noticeable/p/7636582.html中对socket的编程,已经可以知道如何通过socket编程搭建服务器和客户端了,现在,就在ES ... 
- android Socket 编程
		Socket 通信 1.UDP实现 (DatagramSocket) [客户端] //首先创建一个DatagramSocket对象 DatagramSocket socket = new Datag ... 
- 简单理解php的socket编程
		php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络 ... 
- 读懂Java中的Socket编程
		Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ... 
- Java Socket 编程指南
		Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ... 
随机推荐
- 什么是linux的ftp
			vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序.特点是小巧轻快,安全易用.并且是一个完全免费开放源码的ftp软件ftp的作用: FTP(File Transfer Protocol, ... 
- centos搭建 nginx一直报错 file not found.
			百度了半天找到别人的解决办法 记录下 摘要: file not found. nginx php 这个问题是你配置文件的问题: 查看就是了不要管 nginx 如何开启解析 PHP 的功能? # 成功安 ... 
- JAVA第三周课后作业
			JAVA课后作业 一.枚举类型 代码: enum Size{SMALL,MEDIUM,LARGE}; public cl ass EnumTest { public static void main( ... 
- C++常用的#include头文件总结
			C++常用的#include头文件总结 这篇文章主要介绍了C++常用的#include头文件,对初学者理解C++程序设计大有好处的相关资料 本文详细罗列了C++所包含的头文件的名称及作用说明,比较 ... 
- cannot start session without errors
			访问phpmyadmin出现如标题错误,解决方案如下: cd /var/lib/php 更改目录权限chown nginx:nginx -R session/ That's All! 
- Debian 8安装ibus输入法
			# apt-get install ibus ibus-sunpinyin ibus-table-wubi 
- ecshop上传图片2
			html代码 <tr> <td class="label">{$lang.lab_picture}</td> <td> <in ... 
- Nancy总结(一)Nancy一个轻量的MVC框架
			Nancy是一个基于.net 和Mono 构建的HTTP服务框架,是一个非常轻量级的web框架. 设计用于处理 DELETE, GET, HEAD, OPTIONS, POST, PUT 和 PATC ... 
- webstorm总结
			webStorm修改文件类型,文件着色 File->Settings->Editor->File Types 
- Orchard源码分析(1):Orchard架构
			本文主要参考官方文档"How Orchard works"以及Orchardch上的翻译. 源码分析应该做到庖丁解牛,而不是以管窥豹或瞎子摸象.所以先对Orchard架构有 ... 
