Добавить таймер, который срабатывает после определенного интервала времени ожидания
Объявить константу для интервала времени ожидания и свойство для таймера
private let timeoutSeconds = 30
private var timer : DispatchSourceTimer?
и написать две функции для запуска и остановки таймер.
fileprivate func startDispatchTimer()
{
let interval : DispatchTime = .now() + .seconds(timeoutSeconds)
if timer == nil {
timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())
timer!.schedule(deadline:interval)
timer!.setEventHandler {
// do something when the timer fires
self.timer = nil
}
timer!.resume()
}
}
fileprivate func stopDispatchTimer()
{
timer?.cancel()
timer = nil
}
Запустите таймер после инициализации экземпляра сервера и остановите его в случае успеха. В случае неудачи добавьте код в закрытие setEventHandler
для обработки тайм-аута, например, для освобождения экземпляра сервера.
Используйте следующее:
while (inputStream.available()>0) {
int numBytes = inputStream.read(readBuffer);
System.out.print(new String(readBuffer));
}
Вы печатаете результат из цикла с условием продолжения. Однако код в цикле может работать несколько раз, таким образом, блок данных будет потерян.
Попытайтесь сбросить входной буфер порта прежде, чем сделать Ваше чтение. Иначе, если передающий конец отправил данные во время запуска Вашей программы (или тесно прежде, который мог бы быть до операционной системы), Вы получите старые буферизированные данные.
Кроме того, если это возможно, рассмотрите добавляющее структурирование сообщения к протоколу, таким образом, можно обнаружить при чтении чего-то, что не является, на самом деле, полным сообщением, и отбросьте его. Это часто очень полезно с этими видами проблем.
Это смотрит, как будто Вы читали остальную часть некоторого сообщения, которое было отправлено перед запуском.
Попытайтесь считать как можно больше данных, поскольку Вы запускаете программу для очистки любых аппаратных буферов. После этого запустите свою обработку.