package org.jboss.xnio.lihptest;
import org.xnio.*;
import org.xnio.channels.AcceptingChannel;
import org.xnio.channels.Channels;
import org.xnio.channels.StreamSinkChannel;
import org.xnio.channels.StreamSourceChannel;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
public final class SimpleEchoServer {
public static void main(String[] args) throws Exception {
class ReadListener implements ChannelListener<StreamSourceChannel> {
private StreamSinkChannel sinkChannel;
public ReadListener(StreamSinkChannel sinkChannel) {
this.sinkChannel = sinkChannel;
}
public void handleEvent(StreamSourceChannel channel) {
final ByteBuffer buffer = ByteBuffer.allocate(512);
int res;
try {
while ((res = channel.read(buffer)) > 0) {
buffer.flip();
ByteBuffer view = buffer.asReadOnlyBuffer();
String s = StandardCharsets.UTF_8.decode(view).toString();
System.out.println("recv[" + res + "B UTF-8]: " + s);
Channels.writeBlocking(sinkChannel, buffer);
buffer.clear();
}
Channels.flushBlocking(sinkChannel);
if (res == -1) {
channel.close();
} else {
channel.resumeReads();
}
} catch (IOException e) {
e.printStackTrace();
IoUtils.safeClose(channel);
}
}
}
class AcceptListener implements ChannelListener<AcceptingChannel<StreamConnection>>{
@Override
public void handleEvent(AcceptingChannel<StreamConnection> channel) {
try {
StreamConnection accepted;
while ((accepted = channel.accept()) != null) {
System.out.println("accepted "
+ accepted.getPeerAddress());
accepted.getSourceChannel().setReadListener(new ReadListener(accepted.getSinkChannel()));
accepted.getSourceChannel().resumeReads();
}
} catch (IOException ignored) {
}
}
}
final XnioWorker worker = Xnio.getInstance().createWorker(OptionMap.EMPTY);
AcceptingChannel<StreamConnection> serverChannel = worker
.createStreamConnectionServer(new InetSocketAddress(12345),
new AcceptListener(), OptionMap.EMPTY);
serverChannel.resumeAccepts();
}
}
摘自:
github.com/ecki/xnio-s…