Существующий протокол GWT-RPC является асимметричным - один формат сообщения используется для перехода от клиента к серверу, а другой формат используется для перехода от сервера к клиенту.Во всей моей работе с RPC я никогда не понимал, почему это так, за исключением, может быть, облегчения отладки, поскольку два формата сообщений несовместимы, поэтому вы сразу же знаете, что ищете?
В любом случае, именно поэтому это не работает - ваш unStreamResult
ожидает сообщение другого формата, которое должно начинаться с //OK
или //EX
, а затем следовать массивом JS.Этот массив будет содержать в основном числа, но также будет содержать массив строк.
В черновом обновлении репозитория GWT-RPC, в настоящее время на https://github.com/vertispan/gwt-rpc (оставьте сообщение об этом ответе, если этоссылка становится устаревшей, я обновлю), мы изменили потоковые читатели и писатели, чтобы они были полностью симметричными.Это позволяет избежать путаницы, с которой вы и другие сталкивались, и дает возможность использовать формат сериализации независимо, например, для связи с веб-работником, или для некоторой простой сериализации в BLOB-объект для использования в IndexedDb или чем-то еще (с оговоркой, чтоэтот формат не версионный, поэтому данные, сохраненные при обновлении приложения, могут больше не работать).
Если вам нужно, чтобы этот формат работал до того, как я завершу этот проект, посмотритечто-то вроде https://github.com/niloc132/webbit-gwt/blob/master/workers/src/main/java/com/colinalworth/gwt/worker/client/impl/StreamReader.java (и StreamWriter.java в одном пакете) - это просто подтипы AbstractSerializationStreamReader
и AbstractSerializationStreamWriter
, но тщательно написанные, чтобы избежать различий между клиентом и читателем.Они написаны для использования ByteBuffers (которые сами оборачивают JS TypedArrays для лучшей производительности).В проекте gwt-rpc есть «модернизированная» версия этого как для строк, так и для ByteBuffers, но они могут быть не полностью совместимы со старым RPC.Использование этих функций также требует дополнительной работы: вы должны прекратить использовать factory.createStreamWriter()
и т. Д., Чтобы построить для вас программу чтения и записи, а затем вы должны получить доступ к полю serializer
из подкласса RemoteServiceProxy (возможно, JSNI?).
Но для вашего случая использования WebSockets вам на самом деле не нужен полностью симметричный проводной формат - вам просто нужно отправить полезную нагрузку по проводу на сервер и декодировать, а затем обработатьсвой ответ и отправьте обратно клиенту.Оказавшись на клиенте, эта полезная нагрузка ответа будет правильно прочитана вашим сообщением unStreamResult
.
И хотя я никогда не отговариваю кого-либо от изобретать колесо, также рассмотрите возможность использования проекта gwt websocket, который я связал.до того, как уже решены многие из этих вопросов.Конечно, он не идеален, но он становится все ближе, поскольку мы делаем его первоклассной функцией в обновленном модуле GWT-RPC.