0


0

WindowsでFlexソケットがデータを送信しない

誰かがこれに光を当てることができることを本当に願っています。 PHPとFlexを使用して、本当にシンプルなチャットサーバー/クライアントを構築しています。 私は多くのチュートリアルに従い、PHPで動作するサーバーとFlexで動作するクライアントを持っていますが、Windowsでクライアントを使用するとメッセージを送信できません。

Macでメッセージを送信すると、サーバーに送信され、接続したWindowsクライアントを含むすべてのクライアントに送信されます。 メッセージは実際にはWindowsクライアントにも表示されますが、Windowsから送信しようとしたときにのみ機能しません。

正しいポートでリッスンしているPHPスクリプトが提供するcrossdomain.xmlファイルを追加しようとしましたが、クライアントがそれを要求することはないようです。 ちなみに、私はプロジェクトをAIRファイルとしてエクスポートしています(違いがある場合はdunno)。

私はこれについて何も見つけられないので、私はどこかで愚かであるのか、Windowsクライアントのために特別な措置を講じる必要があるのか​​疑問に思っていますか?

以下にクライアントコードを貼り付けました(Stack Overflowに投稿したことがないので、コードの書式設定がないことをおizeびします。可能であれば、誰かがそれを修正する方法を説明できますか?)。

    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.MouseEvent;
    import flash.events.ProgressEvent;
    import flash.events.SecurityErrorEvent;
    import flash.net.Socket;

    public var socket:Socket;

    // Run on windowComplete
    protected function init():void {
      btnConnect.addEventListener(MouseEvent.CLICK, onBtnConnectClick);
    }

    // Run on closing
    protected function deinit():void {
      if ( (socket != null) && (socket.connected) ) {
        socket.close();
      }
    }

    // Called when the "Connect" button is clicked
    protected function onBtnConnectClick(e:MouseEvent):void {
      if (txtServer.text != '') {
        socket = new Socket();

        socket.addEventListener(Event.CONNECT, onSocketConnect);
        socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketDataProgress);
        socket.addEventListener(IOErrorEvent.IO_ERROR, onSocketIOError);
        socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSocketSecurityError);

        socket.connect(txtServer.text, new uint(txtPort.text));
        btnSend.addEventListener(MouseEvent.CLICK, onBtnSendClick);
      }
    }

    // Called when the "Send" button is clicked
    protected function onBtnSendClick(e:MouseEvent):void {
      if (txtChatMessage.text != '') {
        txtChatWindow.text += 'You: '+ txtChatMessage.text +"\n";
        socket.writeUTFBytes(txtUsername.text +': '+ txtChatMessage.text);
      }

      txtChatMessage.text = '';
    }

    // Called when the socket is connected
    protected function onSocketConnect(e:Event):void {
      txtChatWindow.text += 'Connected\n\n';
      btnConnect.label = "Disconnect";

      btnConnect.removeEventListener(MouseEvent.CLICK, onBtnConnectClick);
      btnConnect.addEventListener(MouseEvent.CLICK, onSocketDisconnect);
    }

    // Called when the socket recieves data
    protected function onSocketDataProgress(e:ProgressEvent):void {
      var data:String = socket.readUTFBytes(socket.bytesAvailable);

      txtChatWindow.text += data +"\n";
    }

    // Called when there is an IO Error on the socket
    protected function onSocketIOError(e:IOErrorEvent):void {
      txtChatWindow.text += e.text;
    }

    // Called when there is a security error on the socket
    protected function onSocketSecurityError(e:SecurityErrorEvent):void {
      txtChatWindow.text += e.text;
    }

    // Called when the "Disconnect" button is clicked
    protected function onSocketDisconnect(e:MouseEvent):void {
      if ( (socket != null) && (socket.connected) ) {
        socket.close();
      }

      btnConnect.label = "Connect";
      btnConnect.addEventListener(MouseEvent.CLICK, onBtnConnectClick);
    }

1 Answer


4


あは!! 私はそれを考え出した。 多くの検索の後、Windowsが余分なコードを必要としているという疑念を確認する小さなコメントに気付きました。正確には1行です。

MacとLinuxでは、flush()は実行フレーム間で暗黙的に呼び出されますが、Windowsでは、flush()を呼び出さない限りデータは送信されません。

したがって、onBtnSendClick関数は次のようになります。

protected function onBtnSendClick(e:MouseEvent):void {
  if (txtChatMessage.text != '') {
    txtChatWindow.text += 'You: '+ txtChatMessage.text +"\n";
    socket.writeUTFBytes(txtUsername.text +': '+ txtChatMessage.text);
    socket.flush();
  }

  txtChatMessage.text = '';
}