2012-01-03 5 views
0

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

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

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 

И этот текст появляется только после того, как клиент отключился. Я хочу, чтобы показать AS Сообщения поступают в

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

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(); 
} 

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

+0

Нет ли у вас что-то не так? Кажется, IOException происходит. – kosa

ответ

4

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

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

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

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

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

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

+0

+1 отличная идея (после моей идеи флеша(), но он уже думал об этом) –

+0

Wow lol im собирается попробовать, если это сработает, я удалю себя по спине много раз. : D –

+0

Хорошо, поэтому Дэвид вы были правы, я добавил «\ r \ n» к сообщениям. Но мне также пришлось избавиться от строки «socketReader.close;». И хорошо, больно сделать это 60 пакетов в секунду. 60 кадров в секунду достаточно хорошо в любой день. Спасибо за все ваши блестящие результаты, очень ценится. BTW, я попытался отключить Nagle, выполнив socket.noTcpDelay (true); это верно? И я только делал это по коду клиента, а не на сервере, мне нужно сделать это на обоих? –

0

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

+0

Да, у меня есть writer.flush(); по коду клиента уже. Спасибо за ответ в любом случае. Любые другие предложения? Я также опубликую способ написания клиентом. –