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())
我试过你的代码,并遇到同样的问题。我第一次得到结果,然后在第一次运行main后收到“无效的UTF8数据”错误。我已经在多个websockets上尝试了我的版本和您的版本,以确保它不是特定服务器的问题。 (注意:我必须删除代码中的类型签名才能编译它。) – Thomas 2014-10-02 00:50:39
好的,看起来问题不在代码中。也许执行不完整。我建议你尝试一下websocket库中的示例程序https://github.com/vbmithr/ocaml-websocket/blob/master/tests/wscat.ml – ivg 2014-10-02 01:36:10
有服务器和客户端实现,你可以启动一个服务器和检查,是否可以与您的客户进行通信。接下来,您可以使用他们的客户端与您的服务器进行通话等。 – ivg 2014-10-02 01:37:14