Как читать и записывать сетевые сокеты в Java ME на устройстве с симплексным подключением? - PullRequest
4 голосов
/ 10 марта 2009

Я работаю на мобильном коммуникаторе и после установления соединения с сервером, используя следующий метод (чтобы проиллюстрировать, что я использую StreamConnection , InputStream и OutputStream Я распределяю inputStream и outputStream между двумя отдельными потоками, давайте вызывать их Отправитель и Получатель .

Способ подключения:

private InputStream inputStream;
private OutputStream outputStream;
private StreamConnection connection;

    public void connect(String host, String port) throws IOException {

        String connectionString = "socket://" + host + ":" + port;
        connection = (StreamConnection) Connector.open(connectionString);

        inputStream = connection.openDataInputStream();
        outputStream = connection.openOutputStream();
    }
Поток

Отправитель ожидает появления чего-либо в буфере вывода. Когда выходной буфер пуст, Sender ожидает (вызывая метод wait() в потоке отправителя). Любой ввод в выходной буфер вызывает метод notify() в потоке-отправителе.

Receiver поток опрашивает InputStream , используя метод int available(), и когда есть что получить, он вызывает блокирующий метод int read(). В разных эмуляторах все работает как брелок и несколько девичей, которые у меня есть под рукой.

Однако есть один телефон, который, кажется, не работает. Когда один поток вызывает available() или read() для объекта InputThread , в то время как другой поток вызывает write() для объекта OutputStream , поток ввода завершается. Все последующие чтения вернут значение -1 , что означает, что InputStream был закрыт.

После массивного гугл-фу я натолкнулся на этот пост на форумах nokia , где обсуждаются односторонние / дуплексные свойства устройства, и это, похоже, относится к устройство у меня проблемы. Обычно (99% времени) вызовы read () и write () могут выполняться одновременно без каких-либо проблем.

Тогда у меня вопрос: кто-нибудь сталкивался с подобными проблемами? Как / вы могли бы решить проблему независимого чтения одного потока, в то время как другой независимо записывает в установленное соединение, чтобы они не вызывали read () или available () при вызове write ()?

Любые указатели в любых направлениях с благодарностью!

Ответы [ 2 ]

3 голосов
/ 17 июня 2009

Обычно очень мало гарантировано, когда мы говорим о многопоточных приложениях. Я бы порекомендовал использовать один поток в вашем приложении и попытаться управлять им, используя одного работника. У некоторых устройств есть поведенческие проблемы, и поэтому то, что мы видим на одном устройстве, не работает на каком-то другом устройстве.

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

Если вы ожидаете, пока потоки завершат операцию READ или WRITE, похоже, что вы делаете это последовательно. Таким образом, более или менее, все было бы сложно с более чем одним потоком. Вместо этого встроен механизм ожидания-уведомления, основанный на некотором предопределенном факторе и позволяющий потоку SINGLE либо читать, либо записывать в поток сокетов. Переключение между потоками является очень дорогостоящей операцией, чем эта схема. Надеюсь, что это отвечает на ваш вопрос.

2 голосов
/ 11 марта 2009

Между такой проблемой и операторами мобильных сетей, фильтрующими данные, большинство разработчиков мобильных java используют протокол "http://" вместо" socket: // ".

Конечно, это означает, что мы больше не используем дуплексное соединение и вместо этого делаем много запросов GET и POST.

Я далек от идеала, я знаю.

...