0

私はtclでストリーミングアプリケーションを開発しています。httpモードでフローをブロードキャストするVLCサーバーがあります。私がやろうとしているのは、特定のIPアドレスとポート番号を使用してサーバーに接続しようとするクライアントを開発してから、フローをファイルに保存しようとすることです。私が使用しているコードは単純です:

set server localhost
set sockChan [socket $server 1234]
set line [read $sockChan 1000]
puts " vidéo: $line"
close $sockChan

スクリプトをテストしようとすると問題が発生します。接続は認識されていますが、フローを読み取ることができません。'puts'はコンソールに何も表示しません...

何かアイデアはありますか?ありがとうございました..

4

2 に答える 2

2

URL の内容をファイルに保存したいだけなら、標準httpパッケージには-channel直接ダンプできるオプションがあります。例えば:

package require http
set f [open video.dump w]
fconfigure $f -translation binary
set tok [http::geturl "http://server:port/url" -channel $f]
close $f
if {[http::ncode $tok] != 200} {
    # failed somehow...
} else {
    # succeeded
}
http::cleanup $tok

編集:非同期で行う(イベントループが必要です。たとえば、を介してvwait forever):

package require http
set f [open video.dump w]
fconfigure $f -translation binary
proc done {f tok} {
    close $f
    if {[http::ncode $tok] != 200} {
        # failed somehow...
    } else {
        # succeeded
    }
    http::cleanup $tok
}    
http::geturl "http://server:port/url" -channel $f -command "done $f"
# Your code runs here straight away...

コードは認識できるほど似ていますが、順序が少し異なることに注意してください。Tcl 8.5 を持っている場合 — そうでない場合は、なぜですか? — 次に、代わりにラムダ アプリケーションを使用して、コードの見かけ上の順序をさらに似たものにすることができます。

package require http
set f [open video.dump w]
fconfigure $f -translation binary
http::geturl "http://server:port/url" -channel $f -command [list apply {{f tok} {
    close $f
    if {[http::ncode $tok] != 200} {
        # failed somehow...
    } else {
        # succeeded
    }
    http::cleanup $tok
}} $f]
# Your code runs here straight away...
于 2010-07-21T15:30:51.747 に答える
0

あなたは HTTP を扱っているのでlibcurl、TCL のバインディングを調べることをお勧めします。

于 2010-07-21T15:23:32.447 に答える