Пользовательский Servercocketchannel не отслеживает мои добавленные переменныеJAVA

Программисты JAVA общаются здесь
Anonymous
Пользовательский Servercocketchannel не отслеживает мои добавленные переменные

Сообщение Anonymous »

короткое введение:
У меня есть функция мини-чат, где пользователи могут присоединиться к серверу конкретного проекта, размещенного в моем приложении. Каждый раз, когда кто -то нажимает кнопку: «Присоединяйтесь к чату», программа проверяет, находится ли кто -то в настоящее время размещает сервер для этого конкретного проекта, или пользователь, который нажал кнопку, может быть администратором, размещая сервер. Каждый администратор должен иметь возможность закрыть весь чат и вывести всех при выходе. Эти две функции чата обрабатываются двумя списками, хранящимися на сервере: ClientChannels (размер его - это количество онлайн -пользователей) и ClientInterfaces (позволяя закрыть все чаты пользователей и их интерфейсы, отображающие чат, когда администратор выходит из чата). Интерфейсы, отображающие его, пользователь, который не является администратором, не может видеть счет в Интернете и не будет вынужден отключиться от чата, когда администратор. Основная функция фактического общения работает в порядке. Поэтому я все еще могу общаться, пользователь, не являющийся АДМИН, присоединялся к первым созданному серверу, но списки, которые мне нужны для других функций, не совпадают. Пользовательский ServerChannel будет иметь два списка с данными без изменений и общедоступной для всех клиентов, которые присоединяются. Тем не менее, это не работает по какой -то причине, и это то, что я пытаюсь выяснить, почему? Кроме того, я не знаю, возможно ли сохранить весь экземпляр сервера в MySQL, это решило бы портм.

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

    joinChatButton.addActionListener(e -> {
joinChatButton.setEnabled(false);

String selectQuery = "SELECT id, name, ip_address, port FROM servers.locations WHERE name = ?";
String addQuery = "INSERT INTO servers.locations (name, ip_address, port) VALUES (?, ?, ?)";
frame.setState(Frame.ICONIFIED);
try (Connection connection = ds.getConnection();
PreparedStatement statement = connection.prepareStatement(selectQuery);
PreparedStatement ps = connection.prepareStatement(addQuery)) {
statement.setString(1, projectName);
ResultSet resultSet = statement.executeQuery();

if (!resultSet.next()) {
String IP_ADDRESS = InetAddress.getLocalHost().getHostAddress();
new Chat_Interface(serverChannel, true, IP_ADDRESS, projectName, frame, joinChatButton);
ps.setString(1, projectName);
ps.setString(2, IP_ADDRESS);
ps.setInt(3, 5000);
ps.addBatch();

ps.executeBatch();
ps.clearBatch();
} else {
new Chat_Interface(serverChannel, false, resultSet.getString(3), projectName, frame, joinChatButton);
}
} catch (SQLException | UnknownHostException ex) {
throw new RuntimeException(ex);
}
});
frame.add(joinChatButton);

// Make the frame visible
frame.setVisible(true);

frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
area.setEnabled(true);
}
});
}

public static void main(String[] args) throws IOException {
// Example usage
new ProjectInterface("Amazing Project", "Andrei",
"This is a detailed and captivating project description that will now be displayed over multiple lines.  "
+ "The description can go on and on to test how it dynamically adjusts in the label.",
"https://example.com", new JTextArea());
}
< /code>
} < /p>

Сервер: < /p>
< /blockquote>
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;
}
< /code>
} < /p>

Интерфейс чата: < /p>
< /blockquote>
    public Chat_Interface(SimpleServerChannel serverChannel, boolean ownerOfServer, String IPAddress, String projectName, Frame projectInterface, JButton joinButton) {
if (ownerOfServer) {
new Thread(serverChannel::start).start();
}
serverChannel.getClientInterfaces().add(this);
//code...
iconLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() != 1) return;
if (nameField.getText().trim().isEmpty()) return;

try {
if (iconLabel.isEnabled()) {
client.sendMessageToServer(nameField.getText(), ownerOfServer);
statusButton.setText(serverChannel.getClientChannels().size()+"");
nameField.setText("");
}
} catch (IOException ex) {
throw new RuntimeException(ex);
}

if (iconLabel.isEnabled()) {
iconLabel.setEnabled(false);
Timer timer = new Timer(1500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
iconLabel.setEnabled(true);
}
});
timer.setRepeats(false);
timer.start();
}
}
});

Properties props = new Properties();
try {
props.load(Files.newInputStream(Path.of("storefront.properties"), StandardOpenOption.READ));
} catch (IOException e) {
JOptionPane.showMessageDialog(frame, "An error occurred", "Error", JOptionPane.ERROR_MESSAGE);
}
MysqlDataSource ds = new MysqlDataSource();
ds.setServerName("localhost");
ds.setPortNumber(3306);
ds.setUser(props.getProperty("user"));
ds.setPassword(props.getProperty("pass"));
String removeQuery = "DELETE FROM servers.locations WHERE name = ?";
Consumer closeClient = c -> {
frame.dispose();
client.close();
projectInterface.setState(Frame.NORMAL);

if (ownerOfServer) {
serverChannel.getClientChannels().forEach(client1 -> {
try {
client1.close();
} catch (IOException ex) {
//do nothing
}
});
serverChannel.getClientInterfaces().forEach(client1 -> client1.frame.dispose());
}

try (Connection connection = ds.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(removeQuery)) {
preparedStatement.setString(1, projectName);
preparedStatement.execute();
} catch (SQLException e) {
throw new RuntimeException(e);
}
};
< /code>

the CustomServersocketchannel: < /p>
< /blockquote>
public class CustomServerSocket extends ServerSocketChannel {
private final ServerSocketChannel delegate; // Real instance
private List clientChannels;
private List clientInterfaces;

public CustomServerSocket(SelectorProvider provider, List clientChannels, List clientInterfaces) throws IOException {
super(provider);
this.delegate = ServerSocketChannel.open(); // Create a real instance
this.clientChannels = clientChannels;
this.clientInterfaces = clientInterfaces;
}

@Override
public ServerSocketChannel bind(SocketAddress local, int backlog) throws IOException {
return delegate.bind(local, backlog); // Delegate the call
}

@Override
public  ServerSocketChannel setOption(SocketOption name, T value) throws IOException {
return delegate.setOption(name, value); // Delegate the call
}

@Override
public  T getOption(SocketOption name) throws IOException {
return delegate.getOption(name); // Delegate the call
}

@Override
public Set

Подробнее здесь: [url]https://stackoverflow.com/questions/79544715/custom-serversocketchannel-not-keeping-track-of-my-added-variables[/url]

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