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