在进行TCP或者UDP进行局域网通讯时遇到一个很奇怪的问题!通讯间隔为10秒一次,局域网设备-主,服务器-从
运行设备:同一台电脑
问题描述:打包成jar文件运行时 连续接收两次数据,间隔正常10秒,之后60秒,然后又是10秒,60秒,10秒——以此重复!
如果在eclipse运行时:间隔是固定10秒,没有出现以上60秒的情况
求解答,万分感谢!

在进行TCP或者UDP进行局域网通讯时遇到一个很奇怪的问题!通讯间隔为10秒一次,局域网设备-主,服务器-从
运行设备:同一台电脑
问题描述:打包成jar文件运行时 连续接收两次数据,间隔正常10秒,之后60秒,然后又是10秒,60秒,10秒——以此重复!
如果在eclipse运行时:间隔是固定10秒,没有出现以上60秒的情况
求解答,万分感谢!

关注引自免费微信小程序:皆我百晓生
这个问题涉及到Java中的网络编程,尤其是使用TCP或UDP协议在局域网上进行通信。根据您提供的信息,这似乎是一个典型的多线程并发应用的问题。
首先,让我们确定一下问题的关键点:
Runtime.getRuntime().exec()方法执行命令行程序。要解决这个问题,我们需要对您的应用程序进行一些调整。以下是可能的修改步骤:
为了防止TCP和UDP之间数据包的冲突,我们可以创建一个新的UDP端口并将其映射到TCP端口。这样,即使有两个客户端同时试图连接到同一个TCP端口,它们也可以通过不同的UDP端口通信。
public class UDPServer {
private static final int SERVER_PORT = 8080;
private static final int CLIENT_PORT = 9090;
public void startServer() throws IOException {
// 创建一个新的UDP服务器
ServerSocket serverSocket = new ServerSocket(CLIENT_PORT);
System.out.println("UDP Server started on port " + CLIENT_PORT);
while (true) {
try {
Socket clientSocket = serverSocket.accept();
System.out.println("New client connected from " + clientSocket.getInetAddress());
// 处理新连接的客户端
handleClient(clientSocket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void handleClient(Socket clientSocket) throws IOException {
DataInputStream in = new DataInputStream(clientSocket.getInputStream());
DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());
String dataReceivedFromClient = "";
int counter = 0;
boolean isDataReceivedSuccessfully = false;
while (!isDataReceivedSuccessfully && counter < 2) {
byte[] buffer = new byte[1024];
int bytesRead = in.read(buffer);
if (bytesRead > 0) {
dataReceivedFromClient += new String(buffer, 0, bytesRead).trim();
counter++;
} else {
break; // 如果读取失败,则结束循环
}
}
if (counter == 2) { // 数据已经成功接收两次
out.writeBytes(dataReceivedFromClient);
out.flush();
isDataReceivedSuccessfully = true;
}
if (isDataReceivedSuccessfully) {
System.out.println("Received data successfully from client.");
} else {
System.out.println("Error receiving data from client.");
}
clientSocket.close(); // 关闭客户端套接字
}
}
可以考虑在启动应用程序时使用特定的JVM参数,例如 -Djava.net.preferIPv4Stack=true 和 -Djava.nio.channels.useSystemAsFactory=true 来启用IPv4和NIO功能,这些设置可以帮助提高性能,尤其是在处理大量并发请求时。
以上步骤旨在确保在处理多个TCP和UDP连接时,不会发生数据包间的冲突。通过使用新的UDP端口、避免重复数据接收以及适当设置JVM参数,应该能有效解决上述问题。如果您有具体的应用场景或更多的细节,我可以为您提供更具体的建议。