我有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");
}
}
答案 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);
}