Я реализовал программу на Java, которая считывает данные с GPS-устройств через ServerSocket.
ServerSocket serverSocket = new ServerSocket(13811);
serverSocket.setReceiveBufferSize(receiveBufferSize);
Socket incomingSocket = serverSocket.accept();
InputStream stream = incomingSocket.getInputStream();
byte[] buffer = new byte[1000];
StringBuffer sb = new StringBuffer();
System.out.println("START getting message from TCP stream: " + dateFormat.format(Calendar.getInstance().getTime()));
while (stream.read(buffer) > 0)
{
sb.append(new String(buffer));
System.out.println(sb.toString());
}
System.out.println("[incomingMessage]: " + incomingMessage);
System.out.println("FINISHED getting message from TCP stream: " + dateFormat.format(Calendar.getInstance().getTime()));
Однако мы обнаружили, что существует большая задержка (т.е. большое отклонение между временем Sys out "START..." и "FINISHED..." выше). Это время было потрачено на inputStream.read().
Если я использую Java-клиент для подключения к указанному выше порту сервера и отправляю на него данные, то сообщение читается серверным inputStream в течение нескольких мс. Ниже показан код Java-клиента.
Socket socket = new Socket("localhost", 13811);
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
String tobesend = "testing message 1";
out.writeBytes(tobesend);
out.flush();
out.close();
Однако, если я добавлю "Thread.Sleep(10*1000)" перед "out.flush()" и "out.close()", задержка на стороне сервера станет 10 секунд... Поэтому я подозреваю, что если GPS устройство не выполнило "flush" и в результате задержка inputstream.read() на стороне сервера...
К сожалению, у нас нет контроля над TCP-вызовами GPS-устройства, поэтому я не могу внести в него какие-либо изменения, чтобы заставить его "промывать" сообщение в моем входном потоке... Пожалуйста, посоветуйте, есть ли какие-нибудь средства, чтобы серверная сторона могла читать данные из входного потока без такой задержки, даже если клиентская сторона (т.е. GPS-устройство) не выполняет "flush"?