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
原创粉丝点击