Ошибка # 1009 при попытке отправить байт в сокет в сценарии действия 3? - PullRequest
0 голосов
/ 22 октября 2010

Я искал и не могу понять, что это мой код.

import flash.net.Socket;

var mySocket = new Socket

mySocket.connect("127.0.0.1", 5331)

var sym:SimpleButton;

sym.addEventListener(MouseEvent.MOUSE_DOWN, symbtn);
function symbtn(event:MouseEvent):void {
   mySocket.writeUTFBytes(1);
}

Ответы [ 2 ]

0 голосов
/ 22 октября 2010

Flash player реализует странную (и, возможно, неработающую?) Модель для обеспечения безопасности в отношении сокетов. Ему нужно получить разрешение от сервера, прежде чем он отправит все, что вы просите, и его способ запросить это, как выясняется, попытаться подключиться к порту 843 на том же сервере, чтобы отправить ему произвольный запрос разрешения XML-строка, и если это не сработает, она отправит ту же XML-строку в тот же сокет, который вы просили. Предполагается, что сервер отвечает ожидаемым образом в любом из подключений, иначе вы получите ошибку. Это происходит автоматически еще до того, как ваш первый байт будет передан.

Чтобы проверить, действительно ли это происходит с вами, проверьте, что получает сервер. Если вы видите некоторые данные XML, хотя вы их и не отправляли, то это именно так: Flash player запрашивает разрешение.

Насколько мне известно, нет способа заставить Flash Player пропустить запрос, поэтому вы должны соблюдать его, если он будет работать.

  • Если вы управляете своим протоколом, но не хотите помещать небольшую программу, отвечающую на порт 843, вы должны встроить логику, которую ожидает Flash Player, в ваш протокол. Это должен быть XML, это должно быть самое первое, что видит ваш сокет, но как только это будет сделано, вы можете свободно отправлять и получать любые двоичные данные, какие захотите.
  • Если, напротив, вы пытаетесь реализовать какой-то стандартный протокол, который вы не можете изменить, то у вас должен быть ответ сервера на порту 843, где Flash Player собирается стучать.
  • Если вы не можете сделать что-либо из этого, вам не повезло.

Больше информации на adobe.com здесь. Поиск в «файле политики Flash Player» также поможет вам найти много информации об этой проблеме.

В интересах совместного использования, вот как выглядит мой файловый сервер личной политики (в Ruby). Как видите, это может быть довольно просто. Конечно, это не обязательно должен быть Ruby, его можно реализовать на любом языке, который вы хотите, при условии, что он отправляет ответ, который ожидает Flash Player.

#!/usr/bin/ruby -w

require 'socket'

PORT = 843
POLICY_FILE = <<EOF
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <allow-access-from domain="put-your-domain-name-here.com" to-ports="5331" />
</cross-domain-policy>
EOF

gs = TCPServer.new(PORT)
socks = [gs]
while true
  begin
    nsock = select(socks, nil, nil, 1)
    nsock[0].each do |s|
      if s == gs
        new_sock = s.accept
        $stderr.puts "Accepted " + new_sock.to_s
        socks.push(new_sock)
      else
        if s.eof?
          $stderr.puts "Closed " + s.to_s
          s.close
          socks.delete s
        else
          $stderr.puts s
          s.write POLICY_FILE
          s.close
          socks.delete s
        end
      end
    end unless nsock.nil?
  rescue Errno::EAGAIN, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINTR
    $stderr.puts "Info : exc"
    retry
  end
end
0 голосов
/ 22 октября 2010
if (mySocket.connected) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...