package com.example.yuncool;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketTimeoutException;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
public class RevcThread extends Thread {
public static SocketChannel socket=null;
public Selector selector;
ByteBuffer readBuffer=ByteBuffer.allocate(1024);
//定义用来存储发送数据的byte缓冲区
//定义用于接收服务器返回的数据的缓冲区
static ByteBuffer sendBuffer=ByteBuffer.allocate(600);
HeapHandler hHandler;
static Context mContext;
public RevcThread(Context _context)
{
mContext=_context;
}
public void ConnectScokect()
@Override
public void run() {
try
{
Looper.prepare();
socket = SocketChannel.open();
// 设置通道为非阻塞
socket.configureBlocking(false);
// 获得一个通道管理器
selector = Selector.open();
// 客户端连接服务器,其实方法执行并没有实现连接,需要在listen()方法中调
//用channel.finishConnect();才能完成连接
socket.connect(new InetSocketAddress("192.168.1.100",60000)); //www.yicool.cn
//将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_CONNECT事件。
socket.register(selector, SelectionKey.OP_CONNECT);
while (true&&DefaultActivity.isNetwork)
{
//如果客户端连接没有打开就退出循环
//if(!client.isOpen()) break;
//此方法为查询是否有事件发生如果没有就阻塞,有的话返回事件数量
int shijian=selector.select();
//如果没有事件返回循环
if(shijian==0)
{
continue;
}
//遍例所有的事件
for (SelectionKey key : selector.selectedKeys())
{
//删除本次事件
selector.selectedKeys().remove(key);
//如果本事件的类型为read时,表示服务器向本客户端发送了数据
if (key.isReadable())
{
//将临时客户端对象实例为本事件的socket对象
SocketChannel sc=(SocketChannel) key.channel();
//定义一个用于存储所有服务器发送过来的数据
//将缓冲区清空以备下次读取
readBuffer.clear();
int bytesRead=sc.read(readBuffer);
//此循环从本事件的客户端对象读取服务器发送来的数据到缓冲区中
readBuffer.flip();
// 将字节转化为为UTF-8的字符串
String receivedString = Charset.forName("UTF-8").newDecoder().decode(readBuffer).toString();
};
Thread.sleep(200);
}
Looper.loop();
}
catch (SocketTimeoutException e)
{
// TODO 自动生成的 catch 块
Log.e("RevcThread","SocketTimeoutException");
e.printStackTrace();
}
catch (Exception e)
详细解决方案
线程isAlive的有关问题
热度:250 发布时间:2016-04-23 20:20:11.0