2014-09-25 68 views
3

我正在尝试构建一个Lwt循环,它会将帧推送到WebSocket,等待响应,将其打印到屏幕上,等待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数据”错误。我已经在多个websockets上尝试了我的版本和您的版本,以确保它不是特定服务器的问题。 (注意:我必须删除代码中的类型签名才能编译它。) – Thomas 2014-10-02 00:50:39

+0

好的,看起来问题不在代码中。也许执行不完整。我建议你尝试一下websocket库中的示例程序https://github.com/vbmithr/ocaml-websocket/blob/master/tests/wscat.ml – ivg 2014-10-02 01:36:10

+0

有服务器和客户端实现,你可以启动一个服务器和检查,是否可以与您的客户进行通信。接下来,您可以使用他们的客户端与您的服务器进行通话等。 – ivg 2014-10-02 01:37:14