2016-09-02 4 views
4

Haxeツールキットでソケットを使用する際のガイドのほとんどは、プラットフォーム固有のスレッドの使用に依存しています。これは、ソケットはデフォルトでブロックされるため、ゲームを含む多くの種類のアプリケーションには適さないからです。ブロックせずにクロスプラットフォームでHaxeソケットを使用するにはどうすればよいですか?

ノンブロッキングモードがありますが、例外をスローせずに機能させることはできません。

スレッドを使用せずにクロスプラットフォームでソケットを使用するにはどうすればよいですか?

+0

を、そのいくつかの異常なエラーがあります私はeofのように、最初もつまずいた。私はまだ答えを出す時間がありませんが、おそらくこのコードを見てください。 https://github.com/5Mixer/mphx/blob/master/mphx/server/impl/Server.hx#L90-L207接続を聞くためのソケットがあり、これらの接続のそれぞれがeofエラーなどを処理します。 – 5Mixer

+0

私は答えを見つけ出し、どこにでも投稿されているのを見なかったので、質問を書いて自分で答えました。このコードは、私の答えで説明した特定のエラー処理を文書化するのに非常に便利です。私は情報でそれを更新します。 – oscarcs

答えて

5

Sys.net.Socketは、Python、Neko、Java、マクロ、C++、Lua、PHP、およびC#の8つのHaxeターゲットで動作するメインソケットの実装です。

ねじ切り方法だけでなく、さらに、バックグラウンドでこれらのソケットを使用しての手段は、provided here.

あるしかし、haXeのドキュメントは、ソケットが非ブロッキングモードでどのように機能するかを明確にしていません。以下の例は、ゲームで使用されるクライアントのためのものです。他の用途も同様でなければなりません。これを行うには、ソケットを作成し、定期的な方法でそれを接続します。接続が正常に確立され後

var socket = new Socket(); 

try 
{ 
    socket.connect(new Host('example.com'), 80); 
} 
catch (e: Dynamic) 
{ 
    // handle connection errors... 
} 

、ブロックモードをオフにする必要があります。

socket.setBlocking(false); 

我々は、ソケットを使用することができますソケットが非bがあるので

var out: String = ''; 
try 
{ 
    // could also use .input.readByte(), .input.readDouble() etc. 
    // .read() doesn't work, however. 
    out = socket.input.readLine(); 
} 
catch (e: Dynamic) // catch all types of errors 
{ 
    // can handle specific types of exceptions here. 
} 

:私たちはのtry-catch例外処理を使用する必要が注意すべき点で、ソケットから読み取ることが.inputこれをループで呼び出す必要があります。 これを呼び出すたびに、無視できる「操作がブロックされる」例外が発生します。この例外は、データを待つ間にループ内の他の処理を行うためにソケットからの読み出しを中断するために使用されます。同様に

、我々はソケットに書き込むことができます。

var msg: String = 'hello world!\r\n'; 
try 
{ 
    // could also use socket.write(msg) or socket.output.writeByte() etc... 
    socket.output.writeString(msg); 
} 
catch (e: Dynamic) { } 

我々はまた、特定の例外処理を行うことができます。非ブロックモードでは

catch (e: Dynamic) 
{ 
    // end of stream 
    if (Std.is(e, haxe.io.Eof) || e == haxe.io.Eof) 
    { 
     // close the socket, etc. 
    } 
    else if (e == haxe.io.Error.Blocked) 
    { 
     // not an error - this is still a connected socket. 
     break; 
    } 
    else 
    { 
     trace(e); 
    } 
} 
関連する問題