2014-09-25 4 views
3

Я пытаюсь создать цикл с 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()) 

ответ

1

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

open Lwt 

(* Set up the websocket uri address *) 
let ws_addr = Uri.of_string "websocket_address" 

(* Set up a frame *) 
let ws_frame = Websocket.Frame.of_string "json_string_to_server" 

(* push function *) 
let push (_,push) frame = 
    push (Some frame); 
    return_unit 


(* get stream element and print to screen *) 
let get_element (stream,_) = 
    let print_reply (x : Websocket.Frame.t) = 
    let s = Websocket.Frame.content x in 
    Lwt_io.printlf "%s%!" s in 
    Lwt_stream.next stream 
    >>= print_reply 

let rec main conn : unit t = 
    Lwt_unix.sleep 60.0 
    >>= fun() -> push conn ws_frame 
    >>= fun() -> get_element conn 
    >>= fun() -> main conn 

let() = Lwt_main.run (
    Websocket.open_connection ws_addr >>= main) 
+0

Я пробовал свой код, и я сталкиваюсь с тем же вопросом. Я получаю результат в первый раз, а затем после первого запуска main я получаю ошибки «Недопустимые данные UTF8». Я попробовал свою версию и вашу версию на нескольких веб-сайтах, чтобы убедиться, что это не проблема с конкретным сервером. (Примечание: мне пришлось удалить сигнатуру типа в коде для ее компиляции.) – Thomas

+0

Хорошо, тогда похоже, что проблема не в вашем коде. Возможно, реализация не заполнена. Я бы предложил вам поэкспериментировать с примером программы из библиотеки websocket https://github.com/vbmithr/ocaml-websocket/blob/master/tests/wscat.ml – ivg

+0

, там есть реализация сервера и клиента, вы можете запустить сервер и проверить, может ли он взаимодействовать с вашим клиентом. Затем вы можете использовать своего клиента для разговора с вашим сервером и т. Д. – ivg

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

  • Нет связанных вопросов^_^