Хранение соединений с сокетами в массиве и их использование — Java

#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. Я сохраняю принятый сокет внутри массива и не инициализирую повторно.