Чтение сокета Java сервера - PullRequest
0 голосов
/ 03 января 2012

У меня очень специфическая проблема, и мое последнее средство было задать это в StackOverflow, поэтому, пожалуйста, будьте открыты!

Вот две программы:

A.Клиент: Java-клиент, работающий на телефоне Android.B. Сервер: Java-сервер, работающий на компьютере.

Вот что делают две программы:

Клиент отправляет серверные координаты (в строковом формате) каждые 2 миллисекунды (очень быстро) исервер должен прочитать все те координаты, которые отправляет клиент.Для достижения этого (учитывая, что сервер находится на 10.0.0.1 и прослушивает порт 54321), сервер должен иметь сокет, через который он считывает всю входящую информацию.И да, он получает всю информацию, НО, есть подвох!

Теперь, когда у вас есть предыстория истории, вот проблема:

Клиент подключается ксервер и, как только это произойдет, он начинает отправлять координаты (в строковом формате) с очень высокой скоростью.Сервер получает все сообщения, но не прекращает чтение, если клиент не отключился.Мне нужно, чтобы сервер читал каждое отдельное сообщение по мере его поступления!

Вот код, который я использовал для чтения из сокета (это для сервера, и он находится в своем собственном потоке):

    while(true) {
        try {
            BufferedReader socketReader = 
            new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String str = socketReader.readLine();
            System.out.println("New Message: " + str);
            socketReader.close();
        } catch (IOException e) {
            //Client disconnected
            System.out.println("Client disconnected.");
            break;
        }
    }

Это вывод, который я получаю от клиента (где x и y - числа):

 New Message: x,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,y...and so on

И этот текст отображается только после того, как клиент отключился.Я хочу, чтобы он отображался при входе СООБЩЕНИЙ.

Просто чтобы уточнить, это желаемый результат:

 New Message: x,y
 New Message: x,y
 New Message: x,y
 New Message: x,y
 ... and so on

В случае, если это пригодится, вот методзапись в сокет (этот код от клиента)

PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
while(running) {
    writer = new PrintWriter(socket.getOutputStream(), true);
    writer.write(x+","+y);
    writer.flush();
}

В общем, мне нужно, чтобы мой сервер читал сообщения по мере их поступления, а не читал их все одновременнопосле того, как клиент отключается.PS В C # я также написал сервер, который читает информацию по мере ее поступления, но в Java это не работает!

Ответы [ 2 ]

4 голосов
/ 03 января 2012

Вы звоните readLine , который, как следует из названия, предназначен для чтения строк . Ваши данные не состоят из строк.

Если возможно, измените протокол так, чтобы каждый набор координат заканчивался символом новой строки и / или возврата каретки.

К сожалению, я не думаю, что вы сможете заставить это работать. Разрешение 2 мс просто невозможно по сравнению с обычным сетевым оборудованием, и если вы попытаетесь его форсировать, все сломается. Если вы включите Nagle, вы получите 200 мс задержки от Nagling, когда ACK опаздывает. Если вы отключите Nagle, сброс пакета данных приведет к увеличению вашей задержки через крышу.

Честно говоря, я разорвал бы дизайн и начал бы заново продумывать, каковы ваши требования и как вы собираетесь их удовлетворить.

Где вы нашли устройство Android, которое может отправлять 500 пакетов в секунду ?! Никакой Wi-Fi, о котором я знаю, не может это сделать, и какой смысл использовать GPS по проводам?

(Если вы еще не делаете такие вещи, как сокращение буферов сокетов до абсолютного минимума, использование неблокирующих операций записи и обработку частичных записей путем прерывания и удаления частичных данных в приемнике, вы не приблизитесь к соответствует вашим требованиям. Вы не должны разрешать резервное копирование данных в случае кратковременного падения пропускной способности соединения.)

0 голосов
/ 03 января 2012

Делайте flush() на вашем выходном сокете в вашем клиенте каждый раз.Сообщения на самом деле буферизируются, пока вы не закроете сокет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...