效率通过Socket通信在以下数据传输技术中发布

Kis*_*ada 9 java sockets

很长一段时间我一直面临这个问题,通过良好的实践来实现以下场景.我遇到了问题.如果我在某个地方出错,建议我或指导我.详情如下.

1)我有一个充当服务器套接字程序的PLC.我有一个Java客户端套接字程序来读取服务器中的数据.

由于此处PLC是服务器,它建立被动通信,当客户端启动通信时,服务器向客户端提供来自特定区域的数据,该区域如下所示 Kishore Kumar Korada

正如您在图像中看到的,对于每次读取,客户端程序应从服务器发送区域获取从第一个字节到最后一个字节的所有数据.根据客户端程序提供的偏移量和长度,它处理数据并将其存储到数据库中.

注意:每次客户端程序都应获得具有相同偏移量和长度的类似数据.

2)我不确定我是否可以通过单个套接字连接实现此功能(已尝试但未获得预期结果),是从服务器读取数据,处理数据,将其存储在db中然后关闭套接字.并再次重新创建套接字.而且我每隔1秒就会这样做.这意味着我创建了很多套接字.
整体结构可以如下图所示 Kishore Kumar Korada
3)我用来从服务器获取数据的客户端代码如下

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);
    }
    /* All Processing work */
} 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)

正如你在这里看到的那样,我正在关闭插座.而且我在调度程序中每秒都运行相同的代码片段.

通过拥有所有这些结构,我想问下面的问题
1)我是否可以获得与第一张图片中所见的相同的数据,每次启用时我都可以阅读??? 如果是,可以简单解释一下吗?
2)我的代码片段看起来像客户端套接字程序吗?我知道我已经关闭了插座.实际上就像我之前说过的那样,我每1秒执行相同的代码.如果这不是一个好习惯,你能建议我一个吗?
3)总之,通过查看第二张图片,如何以相同的偏移量一次又一次地从发送区域获得相同的数据?

Jac*_* G. 4

1)每次启用单个套接字连接时,我能否获得与第一张图片中所示相同的数据供我读取?如果是的话,可以简单解释一下吗?

可以,但我不推荐它。因为您每秒接收固定数量的数据并立即处理它,所以我会选择让一个线程负责从套接字读取数据,另一个线程(或线程池)负责处理传入的数据。如果处理数据花费的时间超过一秒,并且您在与 相同的线程上处理它Socket,则数据将很快备份。

2)我的代码片段看起来像客户端套接字程序吗?我知道我已经关闭了那里的插座。实际上就像我之前说过的,我每 1 秒就执行相同的代码。如果这不是一个好的做法,你能给我推荐一个吗?

客户端/服务器程序在很多方面都有所不同,因此没有正确的标准。关于替代解决方案,请参阅我上面写的内容。

3)总的来说,通过查看第二张图,如何以相同的偏移量一次又一次地从发送区域获得相同的数据?

幸运的是,我创建并维护了一个名为SimpleNet的客户端/服务器框架,我认为这会让这变得容易得多!

使用 SimpleNet 的程序的示例代码如下所示:

Client client = new Client();

client.onConnect(() -> {
    // Continuously read 52 bytes of data and invoke the callback when they arrive.
    client.readAlways(52, buffer -> {
        int realValue = buffer.getInt();  // 4 bytes
        int intValue = buffer.getShort(); // 2 bytes

        byte[] operatorNameBytes = new byte[18];
        buffer.get(operatorNameBytes);
        String operatorName = new String(operatorNameBytes);

        byte[] shiftIdBytes = new byte[10];
        buffer.get(shiftIdBytes);
        String shiftId = new String(shiftIdBytes);

        byte[] productIdBytes = new byte[16];
        buffer.get(productIdBytes);
        String productId = new String(productIdBytes);

        int status = buffer.getShort(); // 2 bytes

        // All processing work can occur here or be delegated to a thread pool.
    });
});

client.connect(host, port);
Run Code Online (Sandbox Code Playgroud)

通过保持与服务器的连接打开,我认为最终会比不断创建和销毁Socket对象更便宜。此外,如果您决定发送更多数据,SimpleNet 使用的异步回调应该能够使其具有可扩展性。

注意:假设您的服务器每秒向客户端发送一次数据,那么该示例将适合您,而无需进行任何更改。否则,您可以更改client.readAlwaysclient.read并使用 a每秒ScheduledExecutorService调用一次。client.read如果您的服务器仅在客户端首次连接时向客户端发送数据,那么您也可以使用client.read并每秒重新连接一次客户端。