以下场景解释了我的问题.
我有一个充当服务器套接字程序的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块中的套接字