当前位置: 首页 > 知识库问答 >
问题:

无法调用“java.net.ServerSocket.close()”,因为“Server.Server”为空

壤驷子安
2023-03-14

我正在尝试编写一个简单的客户机/服务器应用程序。我在客户端有一个数据,它会变成一个整数数组并传输到服务器。服务器进行计算并将其返回给客户端。但我的程序却出现了这个例外。

抱歉,我只是在学习,真的需要你的帮助。

public class Client {

    private static Socket clientSocket;
    private static ObjectInputStream in;
    private static ObjectOutputStream out;
    private static int[] parsedValue;

    public Client(String input) {
        try {
            parsedValue = Arrays.stream(input.split(",")).mapToInt(Integer::parseInt).toArray();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Client(int[] input) {
        parsedValue = input;
    }

    public Client(List<Integer> input) {
        try {
            parsedValue = input.stream().mapToInt(d->d).toArray();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    public static void main(String[] args) {
        try {
            try {

               clientSocket = new Socket("localhost", 4004);
               in = new ObjectInputStream(clientSocket.getInputStream());
               out = new ObjectOutputStream(clientSocket.getOutputStream());


                String clientTestString = "440,5,16";
                Client stringClient = new Client(clientTestString);
                out.writeObject(stringClient.parsedValue);
                out.flush();
                System.out.println(in.readObject());


                int[] clientIntsTest = {39, 10, 5};
                Client arrayClient = new Client(clientIntsTest);
                out.writeObject(arrayClient.parsedValue);
                out.flush();
                System.out.println(in.readObject());


                List<Integer> clientsTestList = Arrays.asList(781, 9, 7);
                Client listClient = new Client(clientsTestList);
                out.writeObject(listClient.parsedValue);
                out.flush();
                System.out.println(in.readObject());


            } finally {
                System.out.println("Client was closed");
                clientSocket.close();
                in.close();
                out.close();
            }
        } catch (IOException | ClassNotFoundException e) {
            System.err.println(e);
        }

    }
}
public class Server {

    private static Socket clientSocket;
    private static ServerSocket server;
    private static ObjectInputStream in;
    private static ObjectOutputStream out;
    private static int[] parsedValue;


    public String getResult() {
        return calculation(parsedValue);
    }


    public String calculation(int[] parsedValue) {
        parsedValue[0] = toDecimal(parsedValue[0], parsedValue[1]);

        String answer = "";
        int temp = 0;
        String digits = new String("ABCDEF");

        while (parsedValue[0] > 0) {
            temp = parsedValue[0] % parsedValue[2];

            if (temp < 10) {
                answer = temp + answer;
            } else {
                answer = digits.charAt(temp - 10) + answer;
            }
            parsedValue[0] /= parsedValue[2];
        }

        return answer;
    }

    public int toDecimal(int value, int baseNotation) {
        int i = 0;
        int decimalNumber = 0;
        if (value > 0) {
            while (value != 0) {
                decimalNumber += (value % 10) * Math.pow(baseNotation, i);
                value /= 10;
                i++;
            }
        }
        return decimalNumber;
    }


    public static void main(String[] args) {
        try {
            try {
                server = new ServerSocket(4004);
                System.out.println("Server runs");

                clientSocket = server.accept();

                try {

                    in = new ObjectInputStream(clientSocket.getInputStream());
                    out = new ObjectOutputStream(clientSocket.getOutputStream());

                    parsedValue = (int[]) in.readObject();
                    System.out.println(parsedValue);
                    Server examp = new Server();
                    String answer = examp.getResult();
                    System.out.println(answer);
                    out.writeObject(answer);
                    out.flush();


                } finally {
                    clientSocket.close();
                    in.close();
                    out.close();
                }
            } finally {
                System.out.println("Server closed");
                server.close();
            }
        } catch (IOException | ClassNotFoundException e) {
            System.err.println(e);
        }
    }
}

共有1个答案

章景同
2023-03-14

在这两行中

   Server examp = new Server();
   String answer = examp.getResult();

您创建了一个新对象,它覆盖了字段private static ServerSocket server

更好的解决方案是将main()中的逻辑放入一个单独的方法(如run())中,在main()中实例化一个新的服务器对象,并对其调用run()。不要忘记删除static关键字,使所有字段都成为实例成员。

public static void main(String[] args) {
    Server examp = new Server();
    examp.run();
}

public void run() {
    try {
        try {
        server = new ServerSocket(4004);
        System.out.println("Server runs");

        clientSocket = server.accept();

        try {

            in = new ObjectInputStream(clientSocket.getInputStream());
            out = new ObjectOutputStream(clientSocket.getOutputStream());

            parsedValue = (int[]) in.readObject();
            System.out.println(parsedValue);
            String answer = getResult();
            System.out.println(answer);
            out.writeObject(answer);
            out.flush();


        } finally {
            clientSocket.close();
            in.close();
            out.close();
        }
        } finally {
            System.out.println("Server closed");
            server.close();
        }
        } catch (IOException | ClassNotFoundException e) {
            System.err.println(e);
    }
}

顺便说一下:你应该总是使用这个模式来摆脱“静态陷阱”。所以我建议你也重构你的客户端计算。

 类似资料:
  • 这里有两节课。SaleGood类有一个可变特性a,应该在另一个名为Inventory类中使用。类Inventory有两个可变特性,inventoryAmount和inventoryBill,这两个特性都应该在类Salegood中使用。 我正在使用getter/setter。然而,错误说 我以为是因为这个代码错了?因此我不能使用。我试了一整天。但仍然不知道如何修复它。我尝试了,也是错误的。 在课堂上

  • 我刚来spring boot,就偶然发现了这个奇怪的例外。 目的:我正在尝试构建一个基本的spring boot rest客户端应用程序。 问题:获取异常为空的错误。即 当我的@RequestMapping值为“Employee”时, 但当我将其改为“模板/员工”时, 它会抛出下面附加的错误。谁能找出并解释是什么引起了这个问题?谢谢. 错误 这里是我的pom.xml以供参考 error.jsp

  • 我在eclipse上不断收到这个错误,说Jan 26 2021年12:58:03 AM org.apache.catalina.core.StandardWrapperValve invoke Severe:servlet.Service()for servlet[com.xadmin.userManagement.web.userServlet]在路径为[/UserManagement]的上下文

  • 我一直得到这个错误在我的eclipse说Jan26, 2021 12:58:03AMorg.apache.catalina.core.标准WrapperValve调用SEVERE: Servlet.service()servlet[com.xadmin.usermanagement.web.UserServlet]在上下文中与路径[/UserManagement]抛出异常<--plhd-不能调用j

  • 每次我尝试处理我的/register方法时,我总是收到一个不能调用“com.***.repositories.userrepository.findByEmail(String)”的错误,因为“this.userrepository”是空错误。 我不明白为什么代码会被认为是空的。 控制器- Axios调用- 我的用户存储库-

  • 然后我会得到这样的错误消息:“一个错误已经发生。请参阅日志文件{日志文件的路径}” 当我检查日志文件时,我发现根本原因是找不到WToolkitHookQTJA类: 原因:java.lang.ClassNotFoundException:org.eclipse.swt_3.103.1.v20140903-1938在org.eclipse.osgi.internal.loader.bundleLoad