一段时间后,Java套接字将无法连接到服务器

时间:2016-06-14 07:34:22

标签: java sockets

我有Java客户端连接到我的Java服务器。 Java客户端位于不同的网络中,并且运行在MTX-GTW(嵌入式Linux)上。 当我启动服务器和客户端一切正常,客户端每1分钟发送一次数据。但是一天或更长时间后,客户将逐个停止发送数据。时间各不相同 但程序的其余部分运行正常,因为程序使用HTTP与某些API进行通信,并且我们仍在接收数据。

我检查了服务器调试输出,但我看不到任何错误或异常。我尝试重新启动服务器,它也没有帮助。我的下一步将是,在我的电脑上安装类似的客户端,以便我可以看到调试日志,但这可能需要一些时间。所以你们任何人都知道可能出现什么问题?

我使用Java 7,这里我调用方法打开socket:

static private void createHomeCallTimer() 
    {
        new java.util.Timer().schedule( 
            new java.util.TimerTask() 
            {
                public void run() 
                {
                    log.info("homeCall run");
                    Main main = new Main();
                    String data = "xxxxx";
                    try 
                    {
                        log.info("Start of HOMECALL with data: " + data);
                        new TCPClient().openSocketAndSendData(data);
                        createHomeCallTimer();
                    } catch (Exception e) 
                    {
                        log.error("Exception on homeCall: " + e);
                        createHomeCallTimer();
                    }
                }
            }, 
            HOMECALLTIME 
        );
    }

这是通过该方法调用的客户端:

public class TCPClient
{
    public void openSocketAndSendData(String data) throws IOException
    {
        Logger log = Logger.getLogger(TCPClient.class);
        String ip = "xx.xx.xx.xx";
        int port = 9000;
        Socket clientSocket = new Socket(ip, port);
        log.info("SOCKET TO IKU SERVER OPENED");
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        log.info("IKU SERVER: " + inFromServer.readLine());
        outToServer.writeBytes(data);
        clientSocket.close();
        log.info("SOCKET CLOSED");
    }
}

1 个答案:

答案 0 :(得分:1)

在你说设备内存真的很小之后,这就是我的怀疑。 我没有运行你的代码,但是稍微剥离了它并加快速度以查看会发生什么。

以下是代码:

public class Main {
    private static final int HOMECALLTIME = 10;

    static private void createHomeCallTimer() {
        new java.util.Timer().schedule(new java.util.TimerTask() {
            public void run() {
                // log.info("homeCall run");
                // Main main = new Main();
                String data = "xxxxx";
                System.out.println(data);

                // log.info("Start of HOMECALL with data: " + data);
                // new TCPClient().openSocketAndSendData(data);
                createHomeCallTimer();

            }
        }, HOMECALLTIME);
    }

    public static void main(String[] args) {
        createHomeCallTimer();
    }
}

几分钟后输出结果:

  

线程“Timer-21424”中的异常java.lang.OutOfMemoryError:无法   创建新的本机线程

     

at java.lang.Thread.start0(Native Method)at   java.lang.Thread.start(Thread.java:714)at   java.util.Timer。(Timer.java:160)at   java.util.Timer。(Timer.java:132)at   pkg.Main.createHomeCallTimer(Main.java:13)at   pkg.Main.access $ 0(Main.java:12)at pkg.Main $ 1.run(Main.java:22)at   java.util.TimerThread.mainLoop(Timer.java:555)at   java.util.TimerThread.run(Timer.java:505)

我怀疑递归调用会阻止释放内存并且设备上的内存不足。这只是一种怀疑,但不太符合评论。

使用Timer:

,这是没有递归的相同代码
static private void createHomeCallTimer() {
        new java.util.Timer().scheduleAtFixedRate(new java.util.TimerTask() {
            public void run() {
                // log.info("homeCall run");
                // Main main = new Main();
                String data = "xxxxx";
                System.out.println(data);

                // log.info("Start of HOMECALL with data: " + data);
                // new TCPClient().openSocketAndSendData(data);

            }
        }, 0, HOMECALLTIME);
    }