Flex Sockets не отправляет данные в Windows - PullRequest
0 голосов
/ 17 сентября 2010

Я действительно надеюсь, что кто-то может пролить свет на это.Я строю очень простой чат-сервер / клиент, используя PHP и Flex.Я следовал многим учебникам и у меня есть работающий сервер на PHP и работающий клиент во Flex, за исключением того, что если я использую клиент в Windows, я не могу отправлять сообщения.

Когда я отправляю сообщение на моем Macон проходит на сервер и отправляется всем клиентам, включая любого клиента Windows, которого я, возможно, подключил.На самом деле сообщение также будет отображаться на клиентах Windows, только когда я пытаюсь отправить сообщение из Windows, оно не работает.

Я попытался добавить файл crossdomain.xml, обслуживаемый сценарием PHP, который прослушиваетправильный порт, но ни один из клиентов никогда не запрашивал его, и если клиент работает на Mac, я предположил, что он должен работать на Windows.Кстати, я экспортирую проект в виде файла AIR (не знаю, если это что-то меняет).

Я ничего не могу найти по этому поводу, так что мне интересно, где я где-то глуп?Мне нужно принять какие-то особые меры для клиентов Windows?

Я вставил свой код клиента ниже (я никогда не публиковал в Stack Overflow, поэтому извиняюсь за отсутствие форматирования кода, если возможно, кто-нибудь может объяснить, как исправитьэто?).

    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 Ответ

4 голосов
/ 17 сентября 2010

АГА !! Я понял. После долгих поисков я заметил крошечный комментарий, который подтвердил мои подозрения, что Windows нужен какой-то дополнительный код, а точнее одна строка.

В 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 = '';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...