有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在serverclient中重用socket的java

我正在尝试创建一个客户机-服务器系统:我的服务器是一个raspberry pi,在它上面运行一个python Web服务器,我的客户机在另一台pc上,是用Java编写的。其思想是,服务器收集数据,当它收到客户机的请求时,它将数据发送到客户机。 我的客户应该请求数据,等待10秒,然后再次请求,等等

目前,该系统正在工作,但大约一天后,客户端开始出现大量(但不是持续)socket超时。我认为可能是这样的,因为对于每个请求,我都会创建一个新的用于通信的socket,我认为一天之后,socket就会用完或者类似的事情。这是客户端每10秒执行一次的代码:

    public static String getData() throws Exception {
    TreeSet<Integer> primes = MathUtils.primesSieve(10000);
    try {
        String data = "";
        Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
        socket.setReuseAddress(true);
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        int msg = ColUtils.drawRandomlyWithReplacement(primes, 1, ArrayList::new).get(0);
        out.write(msg+"");
        out.flush();
        String input;
        while ((input = in.readLine()) != null) {
            data += input;
            if (!data.endsWith("#" + prod(msg))) {
                throw new Exception("WRONG ECHO");
            }
        }
        socket.close();

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

    return null;
}

我试图通过使用一个作为封装类成员的socket来修复它,但是在一个请求之后,inputstream停止工作。有没有什么方法可以让我继续使用单个socket与服务器进行所有通信?或者这是推荐的进行此类沟通的方式


共 (2) 个答案

  1. # 1 楼答案

    如果可能的话,尝试使套接字对象保持静态,这只会创建一次,并且每10秒读取一次数据 否则,您可以在调用getData方法之前实例化它,然后读取它。 这样做只会生成套接字的一个副本

    我不认为你的港口已经用完了。 原因可能很简单,您的程序在超时之前没有收到数据。这是坏网络中的正常情况

    如果超时不是以编程方式设置的,套接字通常会无限期地等待,直到收到数据

  2. # 2 楼答案

    尝试先关闭套接字和输入、输出流。正如在你的代码中一样,没有保证你会释放所获取的对象

    PrintWriter out = null;
    BufferedReader in = null;
    Socket socket = null;
    try {
      ...//your statements
    } catch (Exception ex) {
      //catch or whatever
    } finally {
      if (out != null) out.close();
      if (in != null) in.close();
      if (socket != null) socket.close();
    }