重用服务器客户端中的套接字

时间:2015-12-08 15:35:55

标签: java sockets

我正在尝试创建一个客户端 - 服务器系统:我的服务器是一个覆盆子pi,它上面运行一个python webserver,而我的客户端是在另一台PC上编写的是Java。这个想法是服务器收集数据,当它从客户端收到请求时,它会将数据发送到客户端。 我的客户应该请求数据,等待10秒并再次请求等。

目前这个系统正在运行,但是在一天左右之后,客户端开始获得很多(但不是连续的)套接字超时。我认为这可能是这种情况,因为对于每个请求,我创建了一个新的套接字用于通信,我认为在一天之后套接字耗尽或类似的东西。这是客户端每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;
}

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

2 个答案:

答案 0 :(得分:1)

首先尝试关闭套接字并输入输出流。在您的代码中,没有保证您正在发布所获取的对象。

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

答案 1 :(得分:-3)

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

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

如果没有以编程方式设置超时,则套接字通常会无限期地等待,直到它收到数据为止