一、客户端Client
public class Client {
private static final String HOSTNAME = "localhost";
private static final int PORT = 8080;
private static final long CONNECT_TIMEOUT = 30*1000L;
private static final boolean USE_CUSTOM_CODEC = true;
public static void main(String[] args) throws Throwable {
int[] values = new int[50];
for(int i = 0;i< 50;++i){
values[i] = i;
}
NioSocketConnector connector = new NioSocketConnector();
connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);
if (USE_CUSTOM_CODEC) {
connector.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(
new UploadFileProtocolCodecFactory(false)));
} else {
connector.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(
new ObjectSerializationCodecFactory()));
}
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.setHandler(new FileUploadClientHandler(values));
IoSession session;
for (;;) {
try {
ConnectFuture future = connector.connect(new InetSocketAddress(
HOSTNAME, PORT));
future.awaitUninterruptibly();
session = future.getSession();
break;
} catch (RuntimeIoException e) {
System.err.println("Failed to connect.");
e.printStackTrace();
Thread.sleep(5000);
}
}
session.getCloseFuture().awaitUninterruptibly();
connector.dispose();
}
}
二、客户端处理类
FileUploadClientHandler
public class FileUploadClientHandler extends IoHandlerAdapter {
private final static Logger LOGGER = LoggerFactory.getLogger(FileUploadClientHandler.class);
private final int[] values;
private boolean finished;
public FileUploadClientHandler(int[] values) {
this.values = values;
}
public boolean isFinished() {
return finished;
}
@Override
public void sessionOpened(IoSession session) {
for (int i = 0; i < values.length; i++) {
Message m = new Message();
m.setSequence(i);
m.setValue(values[i]);
session.write(m);
}
}
@Override
public void messageReceived(IoSession session, Object message) {
// 接收服务器的消息。强转。
ResultMessage rm = (ResultMessage) message;
if (rm.isOk()) {
// 服务器返回true
// 如果返回的Sequence是最后一个,那么就关闭连接。
if (rm.getSequence() == values.length - 1) {
// 打印值并关闭连接
LOGGER.info("客户端收到服务器的值: " + rm.getValue());
session.close(true);
finished = true;
}
} else {
LOGGER.warn("服务器停止, 断开连接...");
session.close(true);
finished = true;
}
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
session.close(true);
}
}
三、可以试一下效果了。