2009-10-26 4 views
2

Каков наилучший способ отправки серии данных (массива с плавающей точкой) с сервера на клиент непрерывно через Java-сокет? Например, у меня есть сервер, который производит данные с плавающей точкой каждые 1 мс, и я бы хотел отправить эти данные клиенту. Мой план состоит в том, чтобы поместить этот процесс в поток (на стороне сервера) и отправить его клиенту непрерывно. Можно ли достичь этого через Java-сокет? или я должен сначала записать данные в файл перед отправкой его клиенту?Постоянная отправка данных через Java-сокет

Спасибо!

ответ

5

Невозможно выполнить это через сокет. В основном вы настраиваете поток на стороне сервера для отправки данных всякий раз, когда предоставляется новый набор.

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

Просто убедитесь, что на стороне клиента вы предоставляете метод, чтобы убить поток прослушивателя, если сокет закрывается (сервер выключается, сетевой hickup и т. Д.).

1

Пока клиент держит соединение открытым, вы можете отправить данные.

Если вы используете http, то соединение будет закрыто после каждого запроса, если вы не используете что-то вроде Comet. Вы можете посмотреть на википедии, но эта статья может быть полезной с Java POV: http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp-test.html

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

Но, если вы используете http, тогда правила меняются немного, что и является вторым абзацем.

+0

hmmm ... Это не по умолчанию поведение HTTP для «закрытия соединения»: это поведение браузера. – jldupont

+0

Каждый запрос является telnet-соединением и, кажется, закрыт веб-сервером, когда все остальное получено, из моего понимания. –

+0

Но из вопроса прямо не указано, что мы имеем дело с парой браузера/веб-сервера, не так ли? – jldupont

0

Самый простой способ - использовать ObjectInputStream/ObjectOutputStream на стороне клиента/сервера, а затем клиент пытается прочитать из потока. Если новых данных не ожидает клиент, и как только сервер отправит новый массив, клиент его прочитает, обработает и снова запустится. В зависимости от того, что клиент делает, может быть разумным поместить чтение в дополнительный поток, который передает массив фактическому методу обработки.

3

Используя простое программирование сокетов, это не проблема вообще:

  • Открыть TCP соединение между сервером и клиентом
  • Отправьте данные с помощью соединения InputStream и OutputStream
  • Закрыть соединение в случай любой ошибки/разъединения

Обратите внимание, что это решение не очень масштабируемо, и если это нужно масштабировать, вы будете d для использования неблокирующего ввода-вывода (так, чтобы ваш сервер не задушил все открытые соединения и текущие потоки)

Смежные вопросы