Я пытаюсь написать простой клиент / сервер на Java с использованием NIO и селекторов.Сервер очень прост, и это наиболее типичная реализация, которую вы можете найти везде.Вот код сервера (посмотрите на метод start()
):
public final class MyServer {
private int port;
private String address;
public MyServer(String address, int port) {
this.address = address;
this.port = port;
}
public void start() throws IOException {
try {
Selector selector = Selector.open();
ServerSocketChannel socket = ServerSocketChannel.open();
InetSocketAddress addr = new InetSocketAddress(address, port);
socket.bind(addr);
socket.configureBlocking(false);
boolean isAlive = true;
SelectionKey selectKy = socket.register(selector, SelectionKey.OP_ACCEPT, null);
while (isAlive) {
selector.select();
Set<SelectionKey> keysList = selector.selectedKeys();
Iterator<SelectionKey> keys = keysList.iterator();
while (keys.hasNext()) {
SelectionKey theKey = keys.next();
if (theKey.isAcceptable()) {
SocketChannel clientSocket = socket.accept();
clientSocket.configureBlocking(false);
clientSocket.register(selector, SelectionKey.OP_READ);
}
if (theKey.isReadable()) {
SocketChannel clientSocket = (SocketChannel) theKey.channel();
ByteBuffer buffer = ByteBuffer.allocate(9000);
clientSocket.read(buffer);
String result = new String(buffer.array()).trim();
System.out.println(" > SERVER: Request from " + clientSocket.getLocalAddress() + " [ toValidate = " + result + " ], sending tokens...");
//Now I send to the client a list
buffer.flip();
for (int i = 0; i < 5; ++i)
buffer.put((byte) getRandom(1, 10));
clientSocket.write(buffer);
buffer.clear();
System.out.println(" > SERVER: Response successfully sent");
}
keys.remove();
}
}
} catch (Exception e) {
System.out.println("[ SERVER ALERT: " + e.getMessage() + " ]");
}
}
}
Как видите, код довольно простой.Внутри if (theKey.isReadable())
я пытаюсь прочитать небольшую строку из клиента, я печатаю ее на консоль, затем переворачиваю буфер и отправляю некоторые данные обратно клиенту.
Здесь у нас есть клиент, который, к сожалению, имеет проблему, которую я не могу найти:
public void something() throws IOException, InterruptedException {
ByteBuffer buffer = ByteBuffer.allocate(9000);
//Note that mRequests is a List of strings
try (SocketChannel client = SocketChannel.open(new InetSocketAddress(authIPAddr, authPort));) {
//For each transaction in mRequests, get the tokens from the server and verify them
for (String s : mRequests) {
//Write the string to the buffer and send the string
buffer.put(s.getBytes());
client.write(buffer);
buffer.rewind();
//Get response from the server
client.read(buffer);
buffer.clear();
Thread.sleep(1000);
}
}
}
Проблема именно здесь:
buffer.put(s.getBytes());
client.write(buffer);
buffer.rewind();
Я могу сказатьпроблема в том, что сервер должен напечатать
SERVER: запрос от /127.0.0.1:2323 [toValidate = {some_value}], отправка токенов ...
но вместо этого он печатает
SERVER: запрос от /127.0.0.1:2323 [toValidate =], отправка токенов ...
и из этого я предполагаю, что данныене отправляются на сервер.Как я могу решить это?