mm无捷之路 2024-06-26 17:04 采纳率: 0%
浏览 2

关于#java的tcp/udp#的问题:局域网设备-主,服务器-从运行设备:同一台电脑问题描述:打包成jar文件运行时 连续接收两次数据

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

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-26 17:04
    关注

    引自免费微信小程序:皆我百晓生

    这个问题涉及到Java中的网络编程,尤其是使用TCP或UDP协议在局域网上进行通信。根据您提供的信息,这似乎是一个典型的多线程并发应用的问题。

    首先,让我们确定一下问题的关键点:

    1. 在Java环境中,我们使用Runtime.getRuntime().exec()方法执行命令行程序。
    2. 命令行程序包含一个简单的端口转发器,用于将来自客户端的TCP连接转换为UDP连接,并发送到服务器端口。
    3. 当客户端连续尝试接收两个不同的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参数,应该能有效解决上述问题。如果您有具体的应用场景或更多的细节,我可以为您提供更具体的建议。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月26日

悬赏问题

  • ¥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