此例子使用socketchannel和serversocketchannel,把服务端的一个字符串传递到客户端,并且在客户端输出
客户端:
public class Client01 {
SocketChannel client;
Selector selector;
ByteBuffer buffer;
public Client01() throws IOException {
client = SocketChannel.open(new InetSocketAddress("127.0.0.1",9800));
selector = Selector.open();
client.configureBlocking(false);
client.register(selector,SelectionKey.OP_READ);
buffer = ByteBuffer.allocate(5555);
connect();
}
/*
* 连接服务端,并且把传递过来的数据读取到缓冲区
*/
public void connect() throws IOException {
while (true) {
if (selector.select()>0) {
Iterator<SelectionKey> ikeys = selector.selectedKeys().iterator();
while (ikeys.hasNext()) {
SelectionKey selectionKey = ikeys.next();
if (selectionKey.isReadable()) {
reads();
}
ikeys.remove();
}
}
}
}
public void reads() throws IOException {
buffer.clear();
client.read(buffer);
buffer.flip();
System.out.println(new String(buffer.array() ,
0 , buffer.limit() , "UTF-8"));
}
public static void main(String[] args) throws IOException {
Client01 client01 = new Client01();
}
}
服务端:
public class Server01 {
ServerSocketChannel server;
Selector selector;
ByteBuffer buffer;
/*
* 构造函数,初始化各个变量,对ServerSocketChannel进行注册
*/
public Server01() throws IOException {
selector = Selector.open();
server = ServerSocketChannel.open();
server.configureBlocking(false);//设置为非阻塞模式
server.socket().bind(new InetSocketAddress(9800));
server.register(selector, SelectionKey.OP_ACCEPT);
buffer = ByteBuffer.allocate(25550);
openserver();
}
/*
* 此方法把一个字符串传递给客户端
*/
public void openserver() throws IOException {
System.out.println("服务器开启");
while (true) {
if (selector.select()>0) {
Iterator<SelectionKey> ikeys = selector.selectedKeys().iterator();
while (ikeys.hasNext()) {
SelectionKey selectionKey = ikeys.next();
if (selectionKey.isAcceptable()) {
ServerSocketChannel serverSocketChannel = (ServerSocketChannel) selectionKey.channel();
SocketChannel socketChannel = serverSocketChannel.accept();
send(socketChannel, "7758258");
}
ikeys.remove();
}
}
}
}
/*
* 传递数据到客户端函数
*/
public void send(SocketChannel socketChannel,String string) throws IOException {
buffer.clear();//清除缓冲区,在使用一系列通道读取或放置 操作填充此缓冲区之前调用此方法
buffer.put(string.getBytes());
buffer.flip();//反转此缓冲区,在一系列通道读取或放置 操作之后,调用此方法为一系列通道写入或相对获取 操作做好准备
socketChannel.write(buffer);
}
public static void main(String[] args) throws IOException {
Server01 server01 = new Server01();
}
}