package com.abkj.platform.person.test;


import java.io.IOException;

import java.net.InetSocketAddress;

import java.nio.ByteBuffer;

import java.nio.channels.SelectionKey;

import java.nio.channels.Selector;

import java.nio.channels.SocketChannel;

import java.util.Iterator;


import org.junit.Test;


import com.abkj.platform.person.comm.command.Command;

import com.abkj.platform.person.comm.command.CommandMain;

import com.abkj.platform.util.PublicTool;


public class TCPClientTest {

private static ByteBuffer sendbuffer;

private static ByteBuffer receivebuffer;

static byte[] sendbuf;

static byte[] receivebuf;


static SocketChannel socketChannel;

static Selector selector;

static SelectionKey selectionKey;


static int i = 0;//分站数组控制


@Test

public void TCPTest() throws Exception {

run();

}


public void run() throws Exception {


Iterator<SelectionKey> iterator;

connect();

while (true) {

Thread.sleep(1000l);

int n = selector.select(500l);

if (n == 0) {

socketChannel.register(selector, SelectionKey.OP_WRITE);

continue;

}

iterator = selector.selectedKeys().iterator();

while (iterator.hasNext()) {

selectionKey = iterator.next();

iterator.remove();

handleKey(selectionKey, sendbuf);

}

}


}


private static void handleKey(SelectionKey selectionKey, byte[] sendbuf)

throws IOException {

byte[] stationid = { 1, 2,3, 31 };

boolean clearposition = true;

boolean clear = false;

int max = 8;

Command command = null;


if (selectionKey.isConnectable()) {

socketChannel = (SocketChannel) selectionKey.channel();

if (socketChannel.isConnectionPending()) {

socketChannel.finishConnect();

}

socketChannel.register(selector, SelectionKey.OP_WRITE);

} else if (selectionKey.isReadable()) {

socketChannel = (SocketChannel) selectionKey.channel();

receivebuffer = ByteBuffer.allocate(10 * 1024);

receivebuffer.clear();

if (socketChannel.read(receivebuffer) > 0) {

byte[] all = receivebuffer.array();

receivebuf = new byte[all[1]];

System.arraycopy(all, 0, receivebuf, 0, all[1]);

System.out.print("接收: ");

PublicTool.printHexString(receivebuf);

}

socketChannel.register(selector, SelectionKey.OP_WRITE);

} else if (selectionKey.isWritable()) {

socketChannel = (SocketChannel) selectionKey.channel();

if (sendbuffer != null)

sendbuffer.clear();

sendbuf = CommandMain.makeCommandWhole(stationid[i], clear,

clearposition, max, command);

i++;

if (i == stationid.length)i = 0;

System.out.print("发送: ");

PublicTool.printHexString(sendbuf);

sendbuffer = ByteBuffer.wrap(sendbuf);

socketChannel.write(sendbuffer);

socketChannel.register(selector, SelectionKey.OP_READ);

}

}


private static void connect() throws IOException {

InetSocketAddress address = new InetSocketAddress("192.168.1.200",

10000);

socketChannel = SocketChannel.open();

socketChannel.configureBlocking(false);

selector = Selector.open();

socketChannel.register(selector, SelectionKey.OP_CONNECT);

socketChannel.connect(address);

}


}