2013-05-08 16 views
15

Webソケット接続を受け入れる必要があるhttp-kitを使用してWebSocketサーバーをセットアップしました。これは、http-kitのマニュアルに示されている基本的な例です。Clojure WebSocketクライアント

質問があります: どのように接続するClojureクライアントを作成しますか?

クライアントにはClojureのhttpライブラリを使用できますが、私は気にしません。私はすでにJavascriptクライアントについて知っており、JavaにはClojureから使用できるAPIがあると私は信じています。しかし、私が探しているのは、ウェブサーバをサポートするClojureライブラリとクライアントの両方のサーバです。私は、http-kitコードではそれが簡単になることは何も見なかった。

+0

Clojure WebSocketクライアントを使用して簡単に作業したいですか?Webベースではないクライアントは、実際にはWebソケットのユースケースではなく、Clojureクライアントがないことが説明されています。しかし、Google for Java websocketクライアントの場合は、いくつかのように見えますが、ClojureでJavaクライアントを設定するためにinteropを使用できます。 。 – georgek

+0

通常のユースケースではありません。私はJavaのものを見て、私はそれがClojureで既存のライブラリで可能かどうかを知りたいだけです。 httpクライアントが存在するので、それは恥ずかしくないようです。 – user2263578

答えて

10

aleph、サーバーとクライアントの両方でWebSocketをサポートしています。非同期スタイルとAlephのコア抽象に慣れるまでには時間がかかるかもしれませんが、一度それを取得すれば非常に良いツールになります。

+0

見つけた、ありがとう。以前は機能名が変わっていたのでそれを除外していましたが、明らかに間違いでした。 – user2263578

7

this announcementによれば、http-kitはWebソケットをサポートしています。 http-kitクライアントが提供する非同期機能に縛られていない場合は、clj-httpも使用できます。彼らは非常に似たインターフェイスを持っているようです(私はまだclj-httpを使っていますが)。


(ns playground.experiments.ws 
    (:use aleph.http lamina.core)) 

(defn ws-client [] (websocket-client {:url "ws://echo.websocket.org:80"})) 

(defn echo [message] 
    (let [channel (wait-for-result (ws-client) 500)] 
    (enqueue channel message) 
     (let [echo (wait-for-result (read-channel channel) 500)] 
     (close channel) 
     echo))) 

(echo "Echo me!") 
+0

私はすでにそれを見た。それはサーバーをサポートしていますが、私のサーバーに接続するhttp-kitクライアントを作成する方法を見つけることができません。非同期はいいかもしれませんが、今は必要ではありません。 clj-httpでサーバに接続したことはありますか?または、他の方法だけラウンド? – user2263578

+0

私はlocalhostに接続しました(そしてweb apisからデータを取得しました)、何の問題も覚えていません。免責事項:これまでのClojureの経験はほとんどありません。単にツールセットを使った実験です。 –

+0

それはちょうど私が探しているものです...何らかの理由で、私はdocでクライアントを作成する方法を見つけることができません。あなたは私に例を教えてくれますか? – user2263578

8

http-kitのクライアントはまだWebSocketをサポートしていません(私はそれに対して良いAPIはないと思います)。 Alephは、この種のユースケースの良い選択肢です。もう1つのオプションはhttp.async.clientです。httpキットのサーバーのWebSocketユニットテストで使用しました。here

+0

著者からの答え、よ! –

+0

ありがとうございます。私はすでにアレフに定住していたので、私はそれに固執するでしょう。しかし、http.asyncも良い選択肢のように見えます。 – user2263578

+2

http-kitは今すぐWebソケットをサポートしています! – Chiron

6

はClojureのWebSocketクライアントです。それはJettyのプロトコルの実装を包みます。

1

基本的なwebsocketクライアントとサーバーを構築しました。javaソケットを使用してWebSocketフレームをラップします。これは、サーバが通常のソケット接続とウェブソケットの両方を同時に受け付けることができるという点でユニークです。

http://github.com/viperscape/gulfstream

例のクライアントコード:2015にご参加人のために

(def clienthandler 
    (with-conn server 
    (send! server "i'm here!") 
    (with-data server data (prn "client received" data)) 
    (prn "client is now disconnected"))) 

(def ws-conn-details {:host "ws://echo.websocket.org/chat",:handler clienthandler}) 

(def client-conn (start-client ws-conn-details)) 
6

:これに新しいものは、私はすべてのさまざまなオプションが利用可能に試してしばらく過ごし、それはかなり困難でした単純なClojure WebSocketクライアントを簡単に設定できるライブラリを見つけることができます。 (公平には、WebSocketクライアントが非ブラウザ/ JavaScriptのコンテキストで動作するのはあまり一般的ではないようで、Clojure スクリプト WebSocketクライアントに重点を置いているようです)

それはよく文書化されていませんが、http.async.clientは私にとっては抵抗が最も少ない経路になってしまいました。私は正常のWebSocketサーバからストリーミングデータを読み込み、これを行うことで、コンソールにそれを印刷することができました:

(ns example.core 
    (:require [http.async.client :as client])) 

(def url "ws://localhost:1337") 

(defn on-open [ws] 
    (println "Connected to WebSocket.")) 

(defn on-close [ws code reason] 
    (println "Connection to WebSocket closed.\n" 
      (format "(Code %s, reason: %s)" code reason))) 

(defn on-error [ws e] 
    (println "ERROR:" e)) 

(defn handle-message [ws msg] 
    (prn "got message:" msg)) 

(defn -main [] 
    (println "Connecting...") 
    (let [client (client/create-client) 
     ws (client/websocket client 
          url 
          :open on-open 
          :close on-close 
          :error on-error 
          :text handle-message 
          :byte handle-message)] 
    (loop [] (recur)))) 

終わりに無限ループがちょうど終了からプロセスを維持することです。 Ctrl-Cを押すまで、ソケットから受信したメッセージはSTDOUTに出力されます。

関連する問題