Moin liebe Community,
ich habe wohl ein Verständnisproblem mit der Funktionalität bzw. dem Aufruf von der read()-Methode vom [JAPI]AsynchronousSocketChannel[/JAPI], da es dort heißt
Darauf aufbauend hab ich eine eigene Klasse vom Typ Server und Client geschrieben, die zu Beginn nach dem Verbindungsaufbau 1x die Methode aufrufen, damit der CompletionHandler beim erfolgreichen oder fehlgeschlagenen Lesen speziell darauf reagieren kann. Nun liest der Client und der Server nur eine einzige Nachricht und danach gar keine mehr, obwohl ich sichergestellt habe, dass beide jeweils sich Nachrichten schicken ohne Fehlermeldung! ???:L
Jetzt vermute ich mal, dass es entweder hiermit etwas zu tun hat oder ich irgendwo einen Verständnisfehler gemacht habe.
Hier mein Client:
und der Server:
ich habe wohl ein Verständnisproblem mit der Funktionalität bzw. dem Aufruf von der read()-Methode vom [JAPI]AsynchronousSocketChannel[/JAPI], da es dort heißt
This method may be invoked at any time.
Darauf aufbauend hab ich eine eigene Klasse vom Typ Server und Client geschrieben, die zu Beginn nach dem Verbindungsaufbau 1x die Methode aufrufen, damit der CompletionHandler beim erfolgreichen oder fehlgeschlagenen Lesen speziell darauf reagieren kann. Nun liest der Client und der Server nur eine einzige Nachricht und danach gar keine mehr, obwohl ich sichergestellt habe, dass beide jeweils sich Nachrichten schicken ohne Fehlermeldung! ???:L
Some channel types may not allow more than one read to be outstanding at any given time.
Jetzt vermute ich mal, dass es entweder hiermit etwas zu tun hat oder ich irgendwo einen Verständnisfehler gemacht habe.
Hier mein Client:
Java:
public class AioClient implements Runnable {
private Object attachment;
private CompletionHandler<Void, Object> handler = new CompletionHandler<Void, Object>() {
@Override
public void completed(Void result, Object attachment) {
write();
server.read(readBuffer, AioClient.this.attachment,
new CompletionHandler<Integer, Object>() {
@Override
public void completed(Integer result, Object attachment) {
System.out.println(new String(readBuffer.array()));
}
@Override
public void failed(Throwable exc, Object attachment) {
exc.printStackTrace();
}
});
}
@Override
public void failed(Throwable exc, Object attachment) {
exc.printStackTrace();
}
};
private AsynchronousSocketChannel server;
private ByteBuffer readBuffer = ByteBuffer.allocate(8192);
private List<AsynchronousSocketChannel> clientList = new LinkedList<AsynchronousSocketChannel>();
public AioClient() throws IOException {
server = AsynchronousSocketChannel.open();
server.connect(new InetSocketAddress("localhost", 3141), null, handler);
}
@Override
public void run() {
// Überprüfung, ob der Server Nachrichten empfängt
Scanner scan = new Scanner(System.in);
String msg;
while (true) {
System.out.println("Schreib eine Nachricht");
msg = scan.nextLine();
write(msg, null);
}
}
private void write(String msg) {
server.write(ByteBuffer.wrap(msg.getBytes()), null,
new CompletionHandler<Integer, Object>() {
@Override
public void completed(Integer result, Object attachment) {
System.out.println("Nachricht gesendet.");
}
@Override
public void failed(Throwable exc, Object attachment) {
}
});
}
}
und der Server:
Java:
public class AioServer implements Runnable {
private AsynchronousServerSocketChannel client;
private ByteBuffer readBuffer = ByteBuffer.allocate(8192);
private List<User> clientList = Collections
.synchronizedList(new ArrayList<User>());
private Map<User, AsynchronousSocketChannel> clientMap = Collections
.synchronizedMap(new HashMap<User, AsynchronousSocketChannel>(50));
private CompletionHandler<Integer, Object> getMessageHandler = new CompletionHandler<Integer, Object>() {
@Override
public void completed(Integer result, Object attachment) {
try {
System.out.println("Nachricht empfangen.");
read();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
@Override
public void failed(Throwable exc, Object attachment) {
System.out.println("Konnte Nachricht nicht lesen.");
exc.printStackTrace();
}
};
private CompletionHandler<AsynchronousSocketChannel, Object> acceptConnHandler = new CompletionHandler<AsynchronousSocketChannel, Object>() {
@Override
public void completed(AsynchronousSocketChannel result,
Object attachment) {
client.accept(null, this);
try {
accept(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
@Override
public void failed(Throwable exc, Object attachment) {
}
};
public AioServer() throws IOException {
client = AsynchronousServerSocketChannel.open().bind(
new InetSocketAddress(3141));
client.accept(null, acceptConnHandler);
}
@Override
public void run() {
while (true) {
// Eigenmächtiges Senden des Servers nach Pausen zur Überprüfung des Empfangs vom Client
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
writeToAll("Xeonkryptos",
"Nachricht vom Server nach Sleep".getBytes());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
private void read() throws InterruptedException, ExecutionException {
for (User user : clientList) {
readBuffer.clear();
clientMap.get(user).read(readBuffer).get(); // Hier nach Kürzung des Codes wieder unsicher, ob das so richtig ist...
writeToAll(user.getName(), readBuffer.array());
}
System.out.println("Nachricht gepostet.");
}
private void accept(AsynchronousSocketChannel result, User user)
throws InterruptedException, ExecutionException {
clientList.add(user);
clientMap.put(user, result);
writeToAll("", ("Xeonkryptos joined the Chat.").getBytes());
result.read(readBuffer, null, getMessageHandler);
}
public void writeToAll(String nick, byte[] data)
throws InterruptedException, ExecutionException {
if (data.length > -1) {
byte[] msgBytes = new byte[nick.getBytes().length + data.length];
byte[] nickByte = nick.getBytes();
for (int i = 0; i < nickByte.length; i++) {
msgBytes[i] = nickByte[i];
}
for (int i = nickByte.length; i < msgBytes.length; i++) {
msgBytes[i] = data[i - nickByte.length];
}
for (User user : clientList) {
clientMap.get(user).write(ByteBuffer.wrap(msgBytes), null,
new CompletionHandler<Integer, Object>() {
@Override
public void completed(Integer result,
Object attachment) {
System.out.println(result + " Bytes gesendet");
}
@Override
public void failed(Throwable exc, Object attachment) {
System.out.println("Fehlgeschlagen");
}
});
}
}
}
}
Zuletzt bearbeitet: