天天看点

android Sockte、ServerSocket阻塞,不同步问题

    从昨天搞到了现在,一直有问题,开始以为是线程通信问题,测试后发现不是,走了好多弯路。用两个真机模拟的,有时候没有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() {
			@Override
			public 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;
		}

		@Override
		public 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();
			}

		}
	}
           

继续阅读