android Sockte、ServerSocket阻塞,不同步问题
来源:互联网 发布:股票大作手回忆录知乎 编辑:程序博客网 时间:2024/05/14 09:01
从昨天搞到了现在,一直有问题,开始以为是线程通信问题,测试后发现不是,走了好多弯路。用两个真机模拟的,有时候没有LogCat,也不知道原因。
有一次发现提示read(),readline(),查了一下readLine()函数,原来是没有数据时,readLine()一直阻塞,直到接收数据。 但是在另一端也是处于阻塞状态。
使用这个函数socket.shutdownOutput(); 半关闭Socket,告诉readLine()函数没有数据了。 这时就不在阻塞了。 还有一种方法是“\r\n”,没有亲自测试。
</pre>服务器端,直接new的线程。<p><pre name="code" class="java">Thread thread = new Thread(new Runnable() {@Overridepublic void run() {BufferedReader br = null;String d;Bundle bundle = new Bundle();bundle.clear();try {ServerSocket serverSocket = new ServerSocket(10001);while (true) {context = "";// 临时接收数据使用Message msg = Message.obtain();Socket socket = serverSocket.accept();// 阻塞监听mHandle.sendEmptyMessage(2);// 通知UI收到连接output = socket.getOutputStream();// 获取输出流input = socket.getInputStream();// 获取输入流// 将字节流转换为字符流,再将字符流缓存br = new BufferedReader(new InputStreamReader(input));// 输出 告诉对方已收到output.write("服务器收到\n".getBytes("utf-8"));output.flush();//刷新缓冲socket.shutdownOutput();//半关闭状态while ((d = br.readLine()) != null) {// 没有数据时,readline一直阻塞context = context + d;}bundle.putString("msg", context);msg.what = 1;msg.setData(bundle);mHandle.sendMessage(msg);output.close();br.close();//关闭各种流input.close();socket.close();}} catch (IOException e) {e.printStackTrace();}}});thread.start();
客户端:
public class SendThread implements Runnable {String sendcontext;public SendThread(String context) {this.sendcontext = context;}@Overridepublic void run() {try {String cc = "";BufferedReader br = null;int d;Bundle bundle = new Bundle();socket = new Socket();// 根据IP建立连接,超时时间10秒socket.connect(new InetSocketAddress(ip, port), 10000);output = socket.getOutputStream();// 获取输出流// 获取输入流input = socket.getInputStream();br = new BufferedReader(new InputStreamReader(input));cc = br.readLine();// 输出 发送区的内容output.write(sendcontext.getBytes("utf-8"));output.flush();mHandler.sendEmptyMessage(0x124);//通知UI更新Message message = Message.obtain();bundle.putString("a", cc);message.what = 0x126;//通知UI更新message.setData(bundle);mHandler.sendMessage(message);br.close();input.close();output.close();// 将字节流转换为字符流,再将字符流缓存socket.close();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
0 0
- android Sockte、ServerSocket阻塞,不同步问题
- Android 7.0(N) Settings 修改Icon 与侧拉栏不同步问题
- android中ServerSocket和Socket通信连接问题
- pts钱包不同步问题
- 网络游戏角色不同步问题
- 阻塞原因(线程,Socket,ServerSocket)
- android socket read阻塞问题
- android socket read阻塞问题
- 解决Mysql主从不同步问题
- mysql主从复制不同步问题
- 解决Mysql主从不同步问题
- vmware时间不同步的问题
- dataguard 日志不同步问题检查
- redis主从不同步问题处理
- LeanCloud数据更新不同步问题
- 解决hbase时间不同步问题
- IOS_音视频不同步问题
- ServerSocket
- declspec(dllexport)和declspec(dllimport) 的使用说明
- R 语言对table进行sql查询
- Hive de 功能架构
- 【阿里云服务器】【ubuntu14.04】搭建apache+php+mysql+phalcon
- Maven集成到工具以及解决内存溢出
- android Sockte、ServerSocket阻塞,不同步问题
- 设计模式-原型模式
- Android Listview滑动时不加载数据,停下来时加载数据,让App更优
- Mybatis批量增加,删除,更新Oracle
- 浅谈WPF DatePicker默认显示 当前时间
- 二叉树中和为某一值得路径java
- SQL Server语法学习笔记
- 01背包
- cf 625 b.War of the Corporations (字符串)