Массив сокетов Java

#java #sockets #networking

#java #сокеты #сеть

Вопрос:

Я создаю серверные и клиентские Java-приложения. Я хотел бы создать массив для хранения моих сокетов. Я использую eclipse, и когда я набираю в этой строке:

 Socket[] sockets = new Socket[3];
  

Eclipse выдает мне сообщение об ошибке «Тип ресурса Socket[] не реализует java.lang.Автоматически закрываемый».

Как я могу это исправить?

Спасибо

Инструкция Try/ Catch:

 try (
                Socket[] sockets = new Socket[3]; //Line giving me error
                ServerSocket serverSocket =
                    new ServerSocket(Integer.parseInt(ip));
                Socket clientSocket = serverSocket.accept();     
                ServerClient client = new ServerClient(clientSocket);

                PrintWriter out =
                    new PrintWriter(clientSocket.getOutputStream(), true);                   
                BufferedReader in = new BufferedReader(
                    new InputStreamReader(clientSocket.getInputStream()));
                //User input
                BufferedReader stdIn =
                    new BufferedReader(
                        new InputStreamReader(System.in))
            ) {
                String inputLine;
                while ((inputLine = in.readLine()) != null) {
                    out.println(inputLine);
                }
            } catch (IOException e) {
                System.out.println("Exception caught when trying to listen on port "
                      port   " or listening for a connection");
                System.out.println(e.getMessage());
                continue;
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
  

Комментарии:

1. вы использовали блок try catch с ресурсами?

2. Я новичок в Java, поэтому я не совсем уверен, что это значит. Я отредактировал сообщение, чтобы показать инструкцию try / catch, в которой она содержится.

3. как я обнаружил прямо сейчас, api сокетов доступны, просто можете ли вы вынуть то, что у вас есть в круглых скобках в try, и поместить их после { this, чтобы посмотреть, что получится?

4. Я вообще не вижу, чтобы вы использовали этот массив.

5. @PM77-1 Ошибка связана не с Socket, а с Socket[].

Ответ №1:

В то время как Socket сам класс реализует AutoCloseable интерфейс, массив сокетов — не реализует.

Проще говоря: вы не можете открыть или закрыть массив.

Ответ №2:

Все ресурсы, определенные в блоке try-with-resources, должны быть автоматически закрываемыми. Вот для чего это нужно. Сокет[] не может быть автоматически закрыт, поэтому его нельзя определить там. Переместите объявление перед попыткой. То же самое для любых других ресурсов, на которых вы получаете ошибку. Не рассматривайте это как общий блок объявления. Это не так.

Ответ №3:

Когда я запускаю ваш код, я получаю это сообщение об ошибке

 Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - incompatible types: try-with-resources not applicable to variable type
    (java.net.Socket[] cannot be converted to java.lang.AutoCloseable)
  

Я советую вам не использовать блок try catch с ресурсами, когда вы хотите определить свой массив сокетов.

        try (
            your rest of code
        ) { 
    define your array here --->  Socket[] sockets = new Socket[3];
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                out.println(inputLine);
            }
        } catch (IOException e) {
           your rest of code 
  

Примечание: Класс сокетов реализует закрываемость и автозакрываемость, но массив не может быть определен в блоке try, как вы пытались сделать

Комментарии:

1. Не могли бы вы рассказать мне, что такое попытка с ресурсами? Честно говоря, я этого не понимаю. Я думаю, если бы я понял, что это было, мне было бы легче это исправить.

2. это новый способ блокировки try catch начиная с java 7. если у вас есть что-то закрываемое, вы можете поместить их между () и это будет закрыто автоматически. как и scanner , resutlset , поэтому не нужно закрывать их вручную. проверьте это docs.oracle.com/javase/tutorial/essential/exceptions /…

3. @user2621270 Смотрите Инструкцию try-with-resources .

Ответ №4:

Вы можете легко перехитрить эту проблему, просто создайте класс, содержащий соединение с сокетом, затем создайте массив объектов этого класса.

Создайте класс:


Class example
{
Socket con;

The constructor and extra code here
...

}

Затем просто создайте массив:

пример[] arr=новый пример[3];