Целью событий против Socketchannel Loop: лучший подход для простой системы чата Java? [закрыто]JAVA

Программисты JAVA общаются здесь
Anonymous
Целью событий против Socketchannel Loop: лучший подход для простой системы чата Java? [закрыто]

Сообщение Anonymous »

Я разрабатываю систему чата в Java и оцениваю два различных подхода для обработки связи:

носканал с некоторой петлей -обычно используемый метод, который является простым для реализации и чтения, хотя и не может быть наиболее эффективной. Подход, который потенциально может обеспечить лучшую эффективность, но включает в себя большую сложность в реализации и обслуживании. Учитывая эти ограничения, я анализирую, будет ли принятие модели, управляемой событиями, обеспечить значимые преимущества по сравнению с более простым подходом Socketchannel. < /P>
Мой текущий сервер выглядит следующим образом: < /p>

Код: Выделить всё

package Chat;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.nio.channels.spi.SelectorProvider;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class SimpleServerChannel {
private List clientChannels = new CopyOnWriteArrayList();
private List clientInterfaces = new ArrayList();

public void start() {

try (CustomServerSocket serverChannel = new CustomServerSocket(SelectorProvider.provider(), clientChannels, clientInterfaces)) {
serverChannel.socket().bind(new InetSocketAddress(5000));
serverChannel.configureBlocking(false);
System.out.println("Server is listening on port " + serverChannel.socket().getLocalPort());
ByteBuffer buffer = ByteBuffer.allocate(1024);

clientChannels = serverChannel.getClientChannels();
clientInterfaces = serverChannel.getClientInterfaces();

while (true) {
SocketChannel clientChannel = serverChannel.accept();
Iterator iterator = clientChannels.iterator();
if (clientChannel != null) {
clientChannel.configureBlocking(false);
clientChannels.add(clientChannel);
System.out.printf("Client %s connected%n", clientChannel.socket().getRemoteSocketAddress());
}

while (iterator.hasNext()) {
SocketChannel client = iterator.next();
try {
buffer.clear();
int bytesRead = client.read(buffer);
if (bytesRead == -1) {
System.out.printf("Client %s disconnected%n", client.socket().getRemoteSocketAddress());
clientChannels.remove(client);
client.close();
} else if (bytesRead > 0) {
buffer.flip();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
String message = String.format("%s", new String((data), StandardCharsets.UTF_8));

for (SocketChannel otherClient : clientChannels) {
buffer.clear();
buffer.put((message).getBytes());
buffer.flip();
while (buffer.hasRemaining()) {
otherClient.write(buffer);
}
}
}
} catch (IOException e) {
System.out.printf("Client %s disconnected due to error%n", client.socket().getRemoteSocketAddress());
clientChannels.remove(client);
client.close();
}
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}

public List getClientChannels() {
return clientChannels;
}

public List getClientInterfaces() {
return clientInterfaces;
}
}
Мой вопрос заключается в том, что если мне придется переключиться со вторым подходом или для моих потребностей (упомянутых ранее), сохранить этот подход достаточно для понимания программирования сети низкого уровня и создания небольшой функции?

Подробнее здесь: https://stackoverflow.com/questions/795 ... hat-system

Вернуться в «JAVA»