1) Могу ли я получать те же данные, которые вы видите на первом изображении, с одним соединением сокета каждый раз, когда мне разрешают читать ???Если да, можно объяснить вкратце?
Вы можете , но я бы не рекомендовал это.Поскольку вы получаете фиксированный объем данных каждую секунду и обрабатываете его сразу же после этого, я бы предпочел, чтобы одному потоку было поручено чтение данных из сокета, а другому потоку (или пулу потоков) - обработка входящих данных.Если обработка данных занимает больше одной секунды, и вы обрабатываете ее в том же потоке, что и Socket
, резервное копирование данных будет выполняться очень быстро.
2) Мой фрагмент кода выглядит как клиентПрограмма сокетов?Я знаю, что закрыл там розетку.На самом деле, как я уже говорил, я выполняю один и тот же код каждую секунду.Если это не очень хорошая практика, не могли бы вы предложить мне одну из них?
Программы клиент / сервер могут отличаться по многим параметрам, поэтому нет правильного стандарта.Что касается альтернативных решений, см. То, что я написал выше.
3) В целом, глядя на второе изображение, как получить одни и те же данные из области отправки снова и снова с одинаковым смещением?
К счастью для вас, я создал и поддерживаю клиент / сервер framework под названием 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);
Если оставить соединение с сервером открытым, я думаю, что в итоге это будет стоить дешевле, чем необходимость постоянно создавать и уничтожать Socket
объекты.Кроме того, асинхронные обратные вызовы, которые использует SimpleNet, должны обеспечить его масштабируемость, если вы когда-нибудь решите отправить больше данных.
Примечание : при условии, что ваш сервер отправляет данные клиенту один раз в секунду, тогда пример будет работать для вас без необходимости что-либо менять.В противном случае вы можете изменить client.readAlways
на client.read
и использовать ScheduledExecutorService
для вызова client.read
один раз в секунду.Если ваш сервер отправляет данные клиенту только при первом подключении, вы также можете использовать client.read
и просто повторно подключать клиент раз в секунду.