Я пытаюсь создать цикл с Lwt, который будет подталкивать кадр к веб-узлу, дождаться ответа, распечатать его на экране, подождать 60 секунд, а затем повторить процесс еще раз. Я смог получить что-то, что компилируется, но у меня пока нет 100% права. В первый раз через цикл все работает нормально, затем каждый раз после этого я получаю сообщение об ошибке «Недопустимые данные UTF8». У меня должно быть что-то неправильно в моем цикле Lwt или в моем понимании протоколов Websocket. Мой код:OCaml websocket «Недопустимые данные UTF8»
#require "websocket";;
#require "lwt";;
#require "lwt.syntax";;
open Lwt
(* Set up the websocket uri address *)
let ws_addr = Uri.of_string "websocket_address"
(* Set up the websocket connection *)
let ws_conn = Websocket.open_connection ws_addr
(* Set up a frame *)
let ws_frame = Websocket.Frame.of_string "json_string_to_server"
(* push function *)
let push frame() =
ws_conn
>>= fun (_, ws_pushfun) ->
ws_pushfun (Some frame);
Lwt.return()
(* get stream element and print to screen *)
let get_element() =
let print_reply (x : Websocket.Frame.t) =
let s = Websocket.Frame.content x in
Lwt_io.print s; Lwt_io.flush Lwt_io.stdout;
in
ws_conn
>>= fun(ws_stream, _) ->
Lwt_stream.next ws_stream
>>= print_reply
let rec main() =
Lwt_unix.sleep 60.0
>>= (push ws_frame)
>>= get_element
>>= main
Lwt_main.run(main())
Я пробовал свой код, и я сталкиваюсь с тем же вопросом. Я получаю результат в первый раз, а затем после первого запуска main я получаю ошибки «Недопустимые данные UTF8». Я попробовал свою версию и вашу версию на нескольких веб-сайтах, чтобы убедиться, что это не проблема с конкретным сервером. (Примечание: мне пришлось удалить сигнатуру типа в коде для ее компиляции.) – Thomas
Хорошо, тогда похоже, что проблема не в вашем коде. Возможно, реализация не заполнена. Я бы предложил вам поэкспериментировать с примером программы из библиотеки websocket https://github.com/vbmithr/ocaml-websocket/blob/master/tests/wscat.ml – ivg
, там есть реализация сервера и клиента, вы можете запустить сервер и проверить, может ли он взаимодействовать с вашим клиентом. Затем вы можете использовать своего клиента для разговора с вашим сервером и т. Д. – ivg