3

我正在尝试使用 Lwt 构建一个循环,将帧推送到 Websocket,等待响应,将其打印到屏幕上,等待 60 秒,然后再次重复该过程。我已经能够得到可以编译的东西,但我还没有 100% 正确。第一次通过循环一切正常,然后每次我收到错误消息“无效的 UTF8 数据”。我的 Lwt 循环或我对 Websocket 协议的理解一定有问题。我的代码:

#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 ())
4

1 回答 1

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)
于 2014-10-01T23:00:53.553 回答