通过套接字通信读取数据时出错

Kis*_*ada 6 java sockets

以下场景解释了我的问题.
我有一个充当服务器套接字程序的PLC.我编写了一个客户端Java程序,通过与PLC的套接字通信进行通信.

在此过程中发生的步骤是:
1)对于每一秒,我的客户端程序碰巧与PLC通信,读取流中的数据,临时将数据存储在ByteArrayOutputStream中并关闭输入流和套接字.以下片段给出了这个想法

    try {
        socket = new Socket(host, port);
        is = socket.getInputStream();
        outputBuffer = new ByteArrayOutputStream();

        byte[] buffer = new byte[1024];
        int read;
        if((read = is.read(buffer)) != -1) {
            outputBuffer.write(buffer, 0, read);
        }
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            System.out.println("Before closing the socket");
            try {
                is.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("After closing the socket");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

2)根据我的要求处理存储的数据是我正在尝试做的事情.因此,每1秒,客户端程序连接到服务器,读取数据(如果存在数据),存储数据,关闭套接字并处理它.它必须在很长一段时间内发生,可能直到服务器程序打开.这可能发生在每隔几周.

3)问题我面临的是,我能够运行上述节目1-2小时,但从那时起,客户端程序无法从服务器程序(在这种情况下为PLC)中获取数据,尽管两者都是通过套接字连接.即,存在128字节的数据,但客户端程序无法读取该数据.这项计划在成功运行近2小时后开始发生

4)请找到可能有助于您查看的简要代码.

public class LoggingApplication {
    public static void main(String[] args) throws NumberFormatException {
        if (args.length > 0 && args.length == 2) {
            String ipAddress = mappingService.getIpAddress();
            int portNo = (int) mappingService.getPortNo();
            ScheduledExecutorService execService = Executors.newScheduledThreadPool(1);
            execService.schedule(new MyTask(execService, ipAddress, portNo, mappingService), 1000, TimeUnit.MILLISECONDS);
        } else {
            throw new IllegalArgumentException("Please pass IPAddress and port no as arguments");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可运行代码:

public class MyTask implements Runnable {

    public ScheduledExecutorService execService;
    private String ipAddress;
    private int portNo;
    private ConfigurationMappingService mappingService;
    private MySocketSocketUtil mySocketSocketUtil;

    public MyTask(ScheduledExecutorService execService, String ipAddress, int portNo, ConfigurationMappingService mappingService) {
        this.execService = execService;
        this.ipAddress = ipAddress;
        this.portNo = portNo;
        this.mappingService = mappingService;
    }

    public void run() {
        MySocketSocketUtil mySocketSocketUtil = new MySocketSocketUtil(ipAddress, portNo);
        execService.schedule(new MyTask(execService, ipAddress, portNo, mappingService), 1000, TimeUnit.MILLISECONDS);

        mySocketSocketUtil.getData();  //It's able to fetch the data for almost 2 hours but from then, it's just getting empty data and it's keep on giving empty data from then. and so on.


        /*
         *
         *Some code
         */
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我遇到的问题
mySocketSocketUtil.getData(); 能够获取数据近2个小时,但从那时起,它只是获取空数据并且从那时起继续提供空数据.等等.这是我知道的一个大问题,而且我想了解可能出现的问题.

编辑:我忽略了检查流结束并根据它关闭套接字的条件是因为,我知道我将永远只读取1024字节的数据.所以,我正在关闭finally块中的套接字

juk*_*kzi 1

您永远不应该断开已建立的连接。在 LoggingApplication 中连接一次。连接套接字后,保持其打开状态。下次读取时重用该套接字。