TCP транспортирует длинные байты с помощью Aleph
Я пытаюсь построить сервер RCP на основе aleph
, Он прошел весь тест, но когда байтовый массив для отправки или получения стал большим, байты кажутся поврежденными.
Например. Я попытался отправить массив байтов, длина которого составляет 2936, но я получил только 1024 байта на сервере
Я последовал примеру и сделал свои собственные модификации для nippy
, Кодирование и декодирование будут выполняться самими обработчиками.
(defn wrap-duplex-stream
[s]
(let [out (s/stream)]
(s/connect out s)
(s/splice out s)))
(defn client
[host port]
(d/chain (tcp/client {:host host, :port port})
#(wrap-duplex-stream %)))
(defn start-server
[handler port]
(tcp/start-server
(fn [s info]
(handler (wrap-duplex-stream s) info))
{:port port}))
1 ответ
Решение
Я наконец сделал свой собственный кодек для байтового массива. Это просто, но понять, как использовать его с глянцем и алефом, отнимает много времени
(defn buffer->byte-array [buf-seq]
(byte-streams/to-byte-array buf-seq))
(defn bytes-codec []
(reify
Reader
(read-bytes [this buf-seq]
(let [buf-seq (dup-bytes buf-seq)
byte-arr (buffer->byte-array buf-seq)]
[true byte-arr nil]))
Writer
(sizeof [x]
nil)
(write-bytes [x y byte-arr]
[(ByteBuffer/wrap byte-arr)])))
(def protocol
(gloss/compile-frame
(gloss/finite-frame
:uint32
(bytes-codec))
#(nippy/freeze %)
#(nippy/thaw %)))
(defn wrap-duplex-stream
[s]
(let [out (s/stream)]
(s/connect
(s/map #(io/encode protocol %) out)
s)
(s/splice
out
(io/decode-stream s protocol))))
(defn client
[host port]
(d/chain (tcp/client {:host host, :port port})
#(wrap-duplex-stream %)))
(defn start-server
[handler port]
(tcp/start-server
(fn [s info]
(handler (wrap-duplex-stream s) info))
{:port port}))