【问题标题】:Array of Sockets JavaJava 的套接字数组
【发布时间】:2014-07-04 00:57:17
【问题描述】:

我正在创建服务器和客户端 Java 应用程序。我想创建一个数组来存储我的套接字。我正在使用 eclipse,当我输入这一行时:

Socket[] sockets = new Socket[3];

Eclipse 给我一个错误提示“资源类型 Socket[] 没有实现 java.lang.AutoCloseable”。

我该如何解决这个问题?

谢谢

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();
            }

【问题讨论】:

  • 你是否对资源使用了 try catch 块?
  • 我是 java 新手,所以我不太清楚这意味着什么。我编辑了帖子以显示它所在的 try/catch 语句。
  • socket api 是可以关闭的,正如我现在发现的那样,你能不能把括号里的东西拿出来试试,然后把它们放在 { this 之后看看会发生什么?
  • 我没有看到你使用这个数组。
  • @PM77-1 错误不是关于 Socket,而是关于 Socket[]。

标签: java sockets networking


【解决方案1】:

虽然Socket 类本身实现了AutoCloseable 接口,但套接字的数组 - 没有。

简单来说:你不能打开或关闭一个数组。

【讨论】:

    【解决方案2】:

    在 try-with-resources 块中定义的资源必须都是可自动关闭的。这就是它的用途。 Socket[] 不是 AutoCloseable,因此不能在那里定义。在尝试之前移动声明。对于您遇到错误的任何其他资源,同上。不要将其视为一般声明块。不是。

    【讨论】:

      【解决方案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 
      

      注意:Socket 类实现了 Closeable 和 AutoCloseable ,但数组不能像你尝试的那样在 try 块中定义

      【讨论】:

      • 你能告诉我什么是资源尝试吗?老实说,我不明白。我想如果我理解它是什么,我会更容易修复它。
      • 这是自 java 7 以来 try catch 块的新方法。如果您有可关闭的东西,您可以将它们放在 () 之间,它将自动关闭。像扫描仪,resutlset,所以不需要手动关闭它们。看看这个docs.oracle.com/javase/tutorial/essential/exceptions/…
      【解决方案4】:

      您可以轻松解决这个问题,只需创建一个包含套接字连接的类,然后构建该类对象的数组。

      构建类:

      Class example { Socket con;

      这里的构造函数和额外代码 ...

      }

      然后构建数组:

      示例[] arr=新示例[3];

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2013-06-18
        • 1970-01-01
        相关资源
        最近更新 更多