最近在学习Android的socket通信,编写完服务器和客户端之后,发现只有客户端可以发送信息到服务器,但是服务器发送数据给客户端的时候,客户端并没有显示接收到数据,当服务器退出的时候,客户端才一股脑将服务器端发送的数据全都显示了出来,说起来惭愧,我看的疯狂Android,只选取了客户端部分编写,服务器端用的是之前自己写的Android4.0.3版本的简单服务器,疯狂Android书上写着:

   
while ((content = br.readLine()) != null) {    // 每当读取到来自服务器的数据之后,发送的消息通知程序    // 界面显示该数据    Message msg = new Message();    msg.what = 0x123;    msg.obj = content;    handler.sendMessage(msg);}
    当客户端读取的数据不为空,就会将数据以发送到handler处理,然后handler打印出数据,就这么简单的功能。

    查看了一些网友的情况,发现了这个问题(原来不止是我出现这个问题),原因也很简单,readline()方法是一个阻塞函数,阻塞函数就是当这个函数不执行完,函数所在线程就一直停止在这里不动,调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。(百度上面的)

    那readline()函数什么时候执行完呢?正常情况下,读取到"\r"、"\n"、"\r\n"就会返回,服务器退出或者异常,也会退出,这就是为什么我退出服务器之后,客户端会一股脑显示出所有数据的原因,因为那些数据都已经被存储到BufferedReader中了,服务器退出,客户端的readline()返回,程序往下走,将数据发送出去,触发handler里面的方法打印出了数据。

    有什么方法可以避免这种情况么?

    我回去找了一下疯狂Android的源代码,发现里面的服务器端发送数据的时候,居然是这样写的:

    os.write((content + "\n").getBytes("utf-8"));

    org………………

    就是说,服务器端为了给客户端知道我发送数据结束了,还需要在数据末添加一个"\n"。偷学了技能之后,我在服务器输入框中,输入一段信息,然后按下回车,再点击发送的时候,客户端成功接收并打印出了信息。

    我在查找readline()方法的时候,也看到一些网友们遇到了这个问题,而且他们写的真的是好,比我这种半吊子强多了,我个人参考了下面的文章:

http://blog.csdn.net/swingline/article/details/5357581

    谢谢大家,今晚就是这样。


彩蛋:

在搜索问题的时候,我发现一个很恐怖的事情,看下图:


org我错了,我真的错了,这个问题03年居然就有人讨论过了吗~~~

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. 【Android(安卓)Training - 04】保存数据 [ Lesson 2 - 保存文件
  4. android之sqliteDatabase,sqliteOpenHelper,ContentProvider
  5. Android中多线程同步问题
  6. Android音频开发(6):使用 OpenSL ES API(上)
  7. ios8.0正式版推送 苹果教大家如何从Android转移到iOS平台?
  8. Android(安卓)客户端访问服务器以及服务器开发
  9. Android音频开发(6):使用 OpenSL ES API(上)

随机推荐

  1. android布局
  2. Ubuntu 64位编译 android 4.0源码
  3. textView自动滑动
  4. 安卓开发09:常用控件-TextView文本展示
  5. Android(安卓)JNI打印信息
  6. 调用与外部接口
  7. Android-Google自己的下拉刷新组件SwipeR
  8. Android(安卓)系统功能设置菜单 LinearLa
  9. Android完全(退出)关闭应用程序
  10. Android(安卓)调用J2EE webservice