2012-01-22 4 views
6

こんにちは、私はFlexからC#サーバに簡単なHTTPメッセージを送信しようとしていますが、私は牽引呼び出しを受けているようです。最初は本当のもの、もう1つは空です。C#サーバでFlexによって起動されたハンドルhttp

どうして私はそれをどう対応できますか?

これは私のC#のコードです:

public void handleSocket(object socketObjeck) 
{ 
    try 
    { 
     socket = (Socket)socketObjeck; 
     byte[] buffer = new byte[1024]; 
     SocketSettings.setSocket(socket); 
     //blocker... 
     try 
     { 
      socket.Receive(buffer); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error\nFaild reading from socket\n" + e.Message); 
      socket.Close(); 
      return; 
     } 
     parseData(buffer); 

     socket.Close(3); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Error\nError \n" + e.Message + "\n" + e.StackTrace); 
    } 
} 

そして、これは私のフレックスコードです:

TcpListener listener = new TcpListener(IPAddress.Any, 9400); 
listener.Start(); 
Console.WriteLine("Server started"); 
Socket client; 
while (true) 
{ 
    client = listener.AcceptSocket(); 
    // client.Available is an expensive call so it's just for testing 
    Console.WriteLine("Client accepted " + client.Connected + " " + client.Available); 
    SocketHandler handler = new SocketHandler(); 
    ThreadPool.QueueUserWorkItem(handler.handleSocket, client); 
} 

これはSocketHandlerのある

var request:URLRequest = new URLRequest(); 
request.data = "Hello from flex"; 
request.url = URL; 
request.method = URLRequestMethod.POST; 
loader.load(request); 

私は常に2つのコールを取得しています。 行:

Console.WriteLine("Client accepted " + client.Connected + " " + client.Available); 

2回と呼ばれます。 私は何が欠けていますか?

編集1: 私は2番目の呼び出しが空であることを確認するためにあなたを伝えることができ、それがさえクロムで見られていないのJavaScriptコンソール、それはフレックス接続を開き、いくつかの応答を待っているようなものだか私にはわかりません何が...しかしそれはデータを送信しません。

編集2:

私は短い睡眠に応答スレッドを入れていた場合、私は予告別のものを真のHTTP応答を送信しようとして

は、2番目の呼び出しは、最初の呼び出しを待たずに来ている (私のテストでは100ミリ秒)、最初のコールに応答する前に2回目のコールを受けています。

P.S のFlex 4.6、@Spenderが述べたようにVisual Studioの2010

+0

実際に何が要求されているのかでクライアント側を見てみませんか? Firebug、FiddlerまたはCharlesはすべてこれを行うことができます。 – spender

答えて

0

結局のところ、クロスドメイン要求でした。 crossdomainファイルをwwwフォルダに追加しないと、flexは空のメッセージを送信します(crossdomainでこのメッセージに応答しようとすると、作業が必要になります)。

3

を使用して、それは難しいの呼び出しが何であるかを知らなくても、通話の理由が何であるかを知っています。

ただし、URLRequestを使用して通信している場合、最初の呼び出しはcrossdomain.xmlファイルの要求である可能性があります。これは、Flash Playerがサーバーと通信するために必要です。

他のプロトコルが異なる初期化呼び出している(例えば、RemoteObjectまたはNetConnectionはセットアップにローカルFlexClientIdをintialコールを送信します、とSocketServerは、特定のポート上のcrossdomain.xmlのために呼び出されます。)

道徳的あなたが応答する前に、コンテンツの内容を確認する必要があります。

+0

+1それは、私が調査が進むかもしれないと考えていたところです(crossdomain.xmlへのリクエスト) – spender

1

私は2つのポイントを参照してください。

  • crossdomain.xmlではなく、サーバー側でTcpListenerHttpListenerを使用して、このクライアント側から仕事をする

  • ためserver-side存在しなければならない、それはあなたを行いますHTTPプロトコルの詳細がすべて実装されており、実際の作業に集中することができるため、コードははるかに堅牢です。

詳細/サンプルなどが必要かどうか質問してください。

+0

確かにHttpListenerは問題を解決しますが、サーバーを実行するための管理者のアクセス許可が必要なのでデバッグできません。マイクロソフトの実装からの余分な解析は時間が無駄であり、私にとっては必要ではありません。そして、最も重要なのは、これで問題が解決するかどうかわからない、おそらく空のメッセージをキャッチしようと思うかもしれないので、私はそれを見ていなくても... ... crossDomainについて、もしそれがesiuだったら、それはまったく動作することができますが、彼はただ不必要なメッセージを送信しています... –

+0

@Babibu 'HttpListener'は管理者権限なしで起動することができます(あなたのケース9400のようにポート> 。管理者権限で 'netsh'を使用してbase-URIを登録することができます。その後、アプリケーション/ HttpListenerをadmin権限なしで実行できます。 – Yahia

+0

@Babibu' HttpListener'は、IISと同じOSコンポーネントを使用しますHTTP.SYS)...空のメッセージを「飲み込む」ことはありません – Yahia

関連する問題