在进行TCP或者UDP进行局域网通讯时遇到一个很奇怪的问题!通讯间隔为10秒一次,局域网设备-主,服务器-从
运行设备:同一台电脑
问题描述:打包成jar文件运行时 连续接收两次数据,间隔正常10秒,之后60秒,然后又是10秒,60秒,10秒——以此重复!
如果在eclipse运行时:间隔是固定10秒,没有出现以上60秒的情况
求解答,万分感谢!
![](https://profile-avatar.csdnimg.cn/316a523fae564496ad528b6f13d9564a_qq_41402635.jpg!4)
关于#java的tcp/udp#的问题:局域网设备-主,服务器-从运行设备:同一台电脑问题描述:打包成jar文件运行时 连续接收两次数据
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注
引自免费微信小程序:皆我百晓生
这个问题涉及到Java中的网络编程,尤其是使用TCP或UDP协议在局域网上进行通信。根据您提供的信息,这似乎是一个典型的多线程并发应用的问题。
首先,让我们确定一下问题的关键点:
- 在Java环境中,我们使用
Runtime.getRuntime().exec()
方法执行命令行程序。 - 命令行程序包含一个简单的端口转发器,用于将来自客户端的TCP连接转换为UDP连接,并发送到服务器端口。
- 当客户端连续尝试接收两个不同的UDP数据包时,可能会导致接收到的数据包之间的延迟超过预期的时间。
要解决这个问题,我们需要对您的应用程序进行一些调整。以下是可能的修改步骤:
步骤 1: 修改端口转发器
为了防止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(); // 关闭客户端套接字 } }
步骤 2: 使用JVM参数
可以考虑在启动应用程序时使用特定的JVM参数,例如
-Djava.net.preferIPv4Stack=true
和-Djava.nio.channels.useSystemAsFactory=true
来启用IPv4和NIO功能,这些设置可以帮助提高性能,尤其是在处理大量并发请求时。总结
以上步骤旨在确保在处理多个TCP和UDP连接时,不会发生数据包间的冲突。通过使用新的UDP端口、避免重复数据接收以及适当设置JVM参数,应该能有效解决上述问题。如果您有具体的应用场景或更多的细节,我可以为您提供更具体的建议。
解决 无用评论 打赏 举报 编辑记录- 在Java环境中,我们使用
悬赏问题
- ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)
- ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)
- ¥30 python,LLM 文本提炼
- ¥15 关于将inet引入的相关问题
- ¥15 关于一个倒计时的操作和显示设计
- ¥15 提问STK的问题,哪位航天领域的同学会啊
- ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
- ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
- ¥15 关于#java#的问题,请各位专家解答!
- ¥15 如何卸载arcgis 10.1 data reviewer for desktop