Я строю сервер, который отправляет данные через один TCP-сокет для каждого пользователя каждые 2 секунды и в отдельном потоке. Есть также специальные события, которые иногда отправляются вместе с регулярными данными. Иногда данные в нескольких пакетах смешивались, поэтому я создал очередь, чтобы убедиться, что этого не произойдет. Однако проблема все еще существует, мой подход неправильный или что-то не так с моим кодом?Обработка параллелизма Java socket
protected void sendData (byte[] data) {
if (isSendingData) {
dataQueue.add(data);
return;
}
isSendingData = true;
Thread sendThread = new Thread() {
public void run() {
try {
BufferedOutputStream outStream = new BufferedOutputStream(connectionSocket.getOutputStream());
outStream.write(data);
outStream.flush();
// check queue, if there are data, send
byte[] moreData = null;
if (dataQueue.size() > 0) {
moreData = dataQueue.remove(0);
}
isSendingData = false;
if (moreData != null) {
sendData(moreData);
}
}
catch (Exception e) {
System.out.println ("Error sending data to peripheral: " + e);
isSendingData = false;
}
}
};
sendThread.start();
}
Вы удаляете только элемент 0 в dataQueue. Что, если размер> 1? –
создайте свой собственный пакет при отправке данных. У вас есть номер для пакета. –
- это 'sendData', вызываемый одновременно из разных потоков? –