#java #sockets #serialization
#java #сокеты #сериализация
Вопрос:
Возможно ли сохранить каждое входящее соединение с сокетами в массиве и использовать каждое, когда нам нужно в Java?
Я попробовал следующую структуру массива, но она выдает Exception in thread "ServerHandler-0" java.lang.ArrayStoreException: java.net.Socket
Мой массив выглядит следующим образом:
Object[][] requests;
И я вставляю объекты в это следующим образом:
requests[position][0] = o; //o is a Serializableobject
requests[position][1] = s; // this is the socket instance
Я намерен использовать сокет, извлеченный из массива:
Socket s = (Socket) requests[position][1];
OutputStream os = s.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(o);
Спасибо.
Ответ №1:
Чтобы избавиться от ArrayStoreException, я бы создал класс запроса, который содержит информацию, а затем сохранил запрос в массиве. Таким образом, вам не нужно выполнять много ненужного приведения и не нужно использовать Object в качестве типа массива. Я также могу порекомендовать вам взглянуть на java.nio
где вы используете каналы и селекторы для выбора желаемых сокетов, что, я думаю, и есть то, что вы пытаетесь сделать.
Комментарии:
1. Какой массив вы имеете в виду? Приведение не является проблемой, поскольку это для академического проекта, и мне как-то нужно вставить экземпляры сокетов в массив.
2. Я имел в виду, что ваши запросы-array должны быть
Request[] requests
вместоObject[][] requests
, а объект запроса содержит экземпляр сокета вместе с другими конкретными данными для этого экземпляра.3. Если это одномерный массив (запросы Request[]), как сохранить как сокет, так и сериализуемый объект? Как вы сопоставляете эти два?
4. Ваш Request-class содержит их оба, поэтому вам не нужно их сопоставлять
5. Становится ли сокет неактивным, когда он переходит в такой массив, как этот? Когда я попытался вызвать
OutputStream os = s.getOutputStream();
сокет, извлеченный из массива , он выдаетException in thread "Thread-1" java.lang.NullPointerException
Ответ №2:
Вы инициализировали запросы [position] к новому объекту [2]?
Комментарии:
1. Я сохраняю принятый сокет внутри массива и не инициализирую повторно.